sed替换未知字符串的位置匹配除以用户定义的分隔符

时间:2019-03-25 17:11:07

标签: linux string shell sed replace

当在分隔符为/

时位于第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

3 个答案:

答案 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