如何在使用bash变量的sed中捕获组

时间:2019-05-13 17:26:22

标签: bash sed

我在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)的示例将给出:

  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。

1 个答案:

答案 0 :(得分:0)

  

您将看到:

     
      
  1. 我使用双引号,因为sed调用变量
  2.   
  3. 我使用 student id date of submission count_in_12_mon 0 100357 2017-02-01 3 1 100364 2018-02-01 4 分隔符而不是@
  4.   
  5. 在这种情况下,我不需要逃脱/ [(已确认)
  6.   
  7. 我尝试使用]来逃避捕获括号的组,但是它不起作用,也尝试使用'('.*')'
  8.   
     

因此,我想知道如何在这样的上下文中捕获组(根据正则表达式语法正确使用()):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) [是不正确的。您需要逃避第一个,而不是第二个。

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