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" >}}
我正在替换以下文件 (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" >}}