bash - 使用 sed 内联替换部分匹配行

标签 bash sed

我有一个 .md 文件,其中包含对其他 .md 文件的多个引用,其形式为:

[Another file](dir/file.md)
[And another file](dir2/anotherfile.md)
[Yet another file](dir3/yetanotherfile.md)

适合此内联替换的 sed 命令是什么:

[Another file](pdf/dir1/file.pdf)
[And another file](pdf/dir2/anotherfile.pdf)
[Yet another file](pdf/dir3/yetanotherfile.pdf)

我知道如何捕捉具有特定模式的线条,例如通过

sed -rn '/\(.+\.md\)/p' README.md 

但我无法对捕获组进行适当的操作来执行转换。

谢谢。

最佳答案

尝试以下操作:

sed -re 's#\[([^]]+)\]\(([^\)]+)\.md\)#[\1](pdf/\2.pdf)#g'

这将匹配整个链接表达式,并将 *.md 替换为 pdf/*.pdf。这也将匹配一行中某处的链接 - 而不是单独的。

如果您想更新文件的内容,请使用 -i 标志:

sed -re 's#\[([^]]+)\]\(([^\)]+)\.md\)#[\1](pdf/\2.pdf)#g' -i README.md

输入:

[Another file](dir/file.md)
[And another file](dir/anotherfile.md)
[Yet another file](dir/yetanotherfile.md)

输出:

[Another file](pdf/dir/file.pdf)
[And another file](pdf/dir/anotherfile.pdf)
[Yet another file](pdf/dir/yetanotherfile.pdf)

关于bash - 使用 sed 内联替换部分匹配行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46888922/

相关文章:

linux - 在 shell 脚本中使用 sed 替代不起作用

sed:从字符串中提取版本号

bash - 用 sed 替换会忽略空格

windows - 带密码的 ssh key 突然*不*要求我输入密码

vim - 在 Vim 中或使用 sed、awk 等将所有带有空格的行填充到固定宽度

linux - 连续打印方式

linux - 有没有办法在 bash 中执行 Linux ifup 或 ifdown 而不必总是先输入 sudo?

sed - 如何使用 sed 将多行追加到一个文件?

bash - 出于安全目的,在 bash 中清理用户输入

java - 同时运行两个java文件