[英]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.