当在分隔符为/
时位于第3层时,想从字符串重命名(未知)文件路径中的(第3个)文件夹。明确需要sed的单线。因为我后来想将它用于tar --transform = EXPRESSION
string="/db/foo/db/bar/db/folder"
echo -e "$string" | sed 's,db,databases,'
仅在第3级将sed替换为“ db”
预期结果
/db/foo/databases/bar/db/folder
答案 0 :(得分:1)
您可以使用捕获组来捕获/db/foo/
,然后匹配db
。然后使用\1
替换中的第一个caputring组:
string="/db/foo/db/bar/db/folder"
echo -e "$string" | sed 's,^\(/[^/]*/[^/]*/\)db,\1databases,'
关于图案
^
字符串的开头\(
开始捕获组
/[^/]*/[^/]*/
使用否定的字符类匹配前2个部分\)
关闭捕获组db
字面上匹配那会给你
/db/foo/databases/bar/db/folder
答案 1 :(得分:1)
如果awk也可以执行此任务:
$ awk 'BEGIN{FS=OFS="/"} $4=="db"{$4="database"} 1' <<<'/db/foo/db/bar/db/folder'
/db/foo/database/bar/db/folder
FS = OFS = "/"
将/
分配给输入和输出字段分隔符,$4 == "db" { $4 = "database }"
,如果第四个字段为db
,则设为database
,1
打印记录。答案 2 :(得分:0)
这是通过设置IFS=/
而无需调用任何外部实用程序来完成此操作的纯bash方式:
string="/db/foo/db/bar/db/folder"
string=$(IFS=/; read -a arr <<< "$string"; arr[3]='databases'; echo "${arr[*]}")
echo "$string"
/db/foo/databases/bar/db/folder