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

标签 sed replace tar

当位于第 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。然后使用 \1 在替换中使用第一个 caputring 组:

string="/db/foo/db/bar/db/folder"
echo -e "$string" | sed 's,^\(/[^/]*/[^/]*/\)db,\1databases,'

关于模式

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

那会给你

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

关于sed 替换未知字符串的位置匹配除以用户定义的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55343129/

相关文章:

bash - 在 bash 中重用变量

regex - 如何将逗号添加到文本文件中一行的最后一个字符

javascript - 根据用户输入替换而不是附加?

python - 获取解压后的 .tar.gz 文件的文件夹名称

python - 指定 tar 文件的目标位置

mysql - 在 Sybase ASE(或使用 Sed)中格式化 bcp 输出文件中的日期时间字段

sed - Solaris sed 标签太长

linux - 在 Linux 中使用 sed 从日志文件中提取行

JQuery SlideToggle 替换图像 src

Linux 项目 : bash script to archive and remove files