【发布时间】:2019-05-13 17:26:22
【问题描述】:
我在 bash 脚本中使用带有变量的 sed 来解析 markdown 图像 ,并且我试图同时捕获一组字符。
“普通”正则表达式的语法如下所示,以捕获 1. 图片图例,2. 图片路径:!\[(.*)\]\((.*)\)
例如来自(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@ - 我尝试使用
'('.*')'转义捕获括号的组,但它不起作用,也尝试使用\(.*\)
因此我想知道如何在这样的上下文中捕获一个组(即如何根据正则表达式语法正确使用()):bash+sed+variables。
【问题讨论】:
-
为什么你认为在这种情况下你不需要转义
[]?这是不正确的。 -
以这种方式使用
sed -i...您不妨将循环重写为for filename in "$3"*; do rm -f "$filename"; done -
wrt
I use double quotes since sed calls variables- 不要这样做,因为它会将整个命令暴露给 shell 以进行解释,只需在最短的部分打开单引号以允许 shell 访问所需的变量,例如做sed 's/foo'"$var"'bar//',而不是sed "s/foo${var}bar//"。不过,我无法弄清楚您的问题是什么 - 如果您需要帮助,请澄清它并展示一个简单、最小的问题示例。