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

sed replace positional match of unknown string divided by user-defined separator

当位于第 3 层且分隔符为 /

时,想要从字符串重命名(未知)文件路径中的(已知)第 3 个文件夹

sed 明确需要一行代码。因为我以后想用它来 tar --transform=EXPRESSION

string="/db/foo/db/bar/db/folder"
echo "$string" | sed 's,db,databases,'

sed 仅在第 3 级替换“db”

预期结果

/db/foo/databases/bar/db/folder

您可以使用捕获组来捕获 /db/foo/,然后匹配 db。然后使用 </code>:</p> 在替换中使用第一个 caputring 组 <pre><code>string="/db/foo/db/bar/db/folder" echo -e "$string" | sed 's,^\(/[^/]*/[^/]*/\)db,databases,'

关于图案

  • ^ 字符串开头
  • \( 开始捕获组
    • /[^/]*/[^/]*/ 使用否定字符匹配前两部分 class
  • \) 关闭捕获组
  • db字面匹配

那会给你

/db/foo/databases/bar/db/folder

如果 awk 也是此任务的一个选项:

$ awk 'BEGIN{FS=OFS="/"} =="db"{="database"} 1' <<<'/db/foo/db/bar/db/folder'
/db/foo/database/bar/db/folder
  • FS = OFS = "/"/ 分配给输入和输出字段分隔符,
  • == "db" { = "database }" 如果第四个字段是 db,则设为 database,
  • 1打印记录。

这是一种纯粹的 bash 方法,通过设置 IFS=/ 而不调用任何外部实用程序来完成此操作:

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