【问题标题】:How to capture a group in a sed that uses bash variables如何在使用 bash 变量的 sed 中捕获组
【发布时间】:2019-05-13 17:26:22
【问题描述】:

我在 bash 脚本中使用带有变量的 sed 来解析 markdown 图像 ![Legend](path/image.png),并且我试图同时捕获一组字符。

“普通”正则表达式的语法如下所示,以捕获 1. 图片图例,2. 图片路径:!\[(.*)\]\((.*)\)

例如来自![[Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)](https://i.imgur.com/p2pwfme.jpg) 会给出:

  1. 传说:[Muybridge, Eadward](https://www.britannica.com/biography/Eadweard-Muybridge/images-videos)(1887)
  2. 路径: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

你会看到:

  1. 我使用双引号,因为 sed 调用变量
  2. 我使用@ 分隔符而不是/
  3. 在这种情况下,我不需要转义 [ ](已确认)
  4. 我尝试使用'('.*')' 转义捕获括号的组,但它不起作用,也尝试使用\(.*\)

因此我想知道如何在这样的上下文中捕获一个组(即如何根据正则表达式语法正确使用()):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//"。不过,我无法弄清楚您的问题是什么 - 如果您需要帮助,请澄清它并展示一个简单、最小的问题示例。

标签: bash sed


【解决方案1】:

你会看到:

  1. 我使用双引号,因为 sed 调用变量
  2. 我使用@ 分隔符而不是/
  3. 在这种情况下,我不需要转义 [ ](已确认)
  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)

这样就向您展示了如何从一般情况下转义正则表达式。

注意事项:

  • 在这种情况下您不需要转义 [ ] 是不正确的。你需要逃避第一个,而不是第二个。

  • 在您的代码示例中,您引用了未定义的变量,以及与示例输入不匹配的模式,所以我对此无能为力。

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2017-04-03
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多