我在bash脚本中使用带有变量的sed来解析降价图像![Legend](path/image.png)
,并且试图同时捕获一组角色。
“常规”正则表达式的语法如下:1.图像图例,2.图像路径:!\[(.*)\]\((.*)\)
例如来自![[Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)](https://i.imgur.com/p2pwfme.jpg)
的示例将给出:
[Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)
https://i.imgur.com/p2pwfme.jpg
但是普通正则表达式使用变量在sed中复杂化。
以下是解析markdown文档中图像的脚本片段(我的问题是最后一个sed命令):
for filename in "$3"*; do
COUNTER=$[$COUNTER +1]
echo "<b>${filename%.*}</b> will be renamed <b>${GET[id]}-img${COUNTER}.*</b><br>"
sed -i -e "s@${filename%.*}@${GET[id]}\-img${COUNTER}@g" ../${GET[id]}.md
mv ${filename%.*}.${filename##*.} ${GET[id]}-img${COUNTER}.${filename##*.}
sed -i -e "s@!['('.*')'](.*${GET[id]}\-img${COUNTER}@![\1](media\/${GET[id]}\-img${COUNTER}@g" ../${GET[id]}.md
done
您将看到:
@
分隔符而不是/
[
]
(已确认)'('.*')'
来逃避捕获括号的组,但是它不起作用,也尝试使用\(.*\)
因此,我想知道如何在这样的上下文中捕获组(即根据正则表达式语法正确使用()
):bash + sed + variables。
答案 0 :(得分:0)
您将看到:
- 我使用双引号,因为sed调用变量
- 我使用
student id date of submission count_in_12_mon 0 100357 2017-02-01 3 1 100364 2018-02-01 4
分隔符而不是@
- 在这种情况下,我不需要逃脱
/
[
(已确认)- 我尝试使用
]
来逃避捕获括号的组,但是它不起作用,也尝试使用'('.*')'
因此,我想知道如何在这样的上下文中捕获组(根据正则表达式语法正确使用()):bash + sed + variables。
要使您的正则表达式(即您称为“正常”正则表达式的正则表达式)适应双引号内的sed,请尝试以下操作:
\(.*\)
然后,如果您输入您提供给我们的输入,您应该看到:
sed "s@!\[\(.*\)]\((.*)\)@Captures: 1: \1 2: \2@"
因此,您可以大致了解如何转义正则表达式。
注意:
在这种情况下,您不需要转义Captures: 1: [Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887) 2: (https://i.imgur.com/p2pwfme.jpg)
[
是不正确的。您需要逃避第一个,而不是第二个。
在您的代码示例中,您引用的是未定义的变量以及与示例输入不匹配的模式,因此我对此无能为力。