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

输出:

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

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

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="" src="/images/post/" >}}~g' file

或者,使用 POSIX ERE:

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

参见online demo. The regex works like is shown here

详情:

  • !\[ - ![ 子串
  • \([^][]*\) - 第 1 组(</code>、POSIX BRE,在 POSIX ERE 中,捕获括号必须转义):除 <code>[]
  • ](\./img/ - ](./img/ 子串(在 POSIX ERE 中,( 必须转义)
  • \([^()]*\) - 第 2 组 (</code>):除 <code>()
  • 之外的任何零个或多个字符
  • ) - ) 字符(在 POSIX BRE 中)(在 POSIX ERE 中必须转义)。

建议使用单个 awk 命令完成所有转换。

 awk -F"[\\]\\[\\(\\)]" '{sub("./img","/images/post");printf("{{< image alt=\"%s\" src=\"%s\" >}}", , )}' <<< $(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" >}}