繁体   English   中英

问题 sed 搜索并用括号替换

[英]Issue with sed search and replace with brackets

我正在替换以下文件 (sample.txt):

![top command output linux](./img/wp-content-uploads-2022-04-top-command-output-linux.jpg)

和:

{{< image alt="top command output linux" src="/images/post/wp-content-uploads-2022-04-top-command-output-linux.jpg" >}}

另外,我需要进行内联文件替换。 这是我所做的:

sed -i -e 's/^!\[/\{\{< image alt="/g' sample.txt

Output:

{{< image alt="top command output linux](./img/wp-content-uploads-2022-04-top-command-output-linux.jpg)

但是,当我尝试将](./img替换为" src="/images/post时,出现错误。我在下面尝试过,但它没有改变任何东西:

sed -i -e 's/^!\[/\{\{< image alt="/g' -e 's/\]\\(.\/img/\" src=\"\/images\/post/g' sample.txt

所以基本上问题出在第二次替换上:

's/\]\\(.\/img/\" src=\"\/images\/post/g'

您可以使用基于 POSIX BRE 的解决方案,例如

sed -i 's~!\[\([^][]*\)](\./img/\([^()]*\))~{{< image alt="\1" src="/images/post/\2" >}}~g' file

或者,使用 POSIX ERE:

sed -i -E 's~!\[([^][]*)]\(\./img/([^()]*)\)~{{< image alt="\1" src="/images/post/\2" >}}~g' file

请参阅在线演示 正则表达式的工作方式如下所示

详情

  • !\[ - 一个![ substring
  • \([^][]*\) - 第 1 组( \1 ,POSIX BRE,在 POSIX ERE 中,必须转义捕获括号): []以外的零个或多个字符
  • ](\./img/ - ](./img/ substring(在 POSIX ERE 中, (必须转义)
  • \([^()]*\) - 第 2 组 ( \2 ):除()之外的任何零个或多个字符
  • ) - a ) char(在 POSIX BRE 中)(在 POSIX ERE 中它必须被转义)。

建议使用单个awk命令进行所有转换。

 awk -F"[\\\]\\\[\\\(\\\)]" '{sub("./img","/images/post");printf("{{< image alt=\"%s\" src=\"%s\" >}}", $2, $4)}' <<< $(echo '![top command output linux](./img/wp-content-uploads-2022-04-top-command-output-linux.jpg)')

结果:

{{< image alt="top command output linux" src="/images/post/wp-content-uploads-2022-04-top-command-output-linux.jpg" >}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM