Caret不能用于Bash正则表达式吗?

时间:2015-01-18 18:23:06

标签: regex bash caret

我尝试匹配Markdown文件中与图片展示位置相对应的行,因此我可以在适当的情况下使用数组中的值替换每个图像的地址。这些行看起来像这样:

![Alt text.](/!/image.jpg)

请注意,括号内的图像地址本身包含一个感叹号,因为这表示需要用实际地址替换它。因此image.jpg充当我创建的数组的键。

说密钥image.jpg的值为http://images.com/an-example-image.jpg。我的Bash脚本的期望结果是:

![Alt text.](http://images.com/an-example-image.jpg) 

我一直在Bash中使用条件运算符来执行此操作...

testfile=$(<test-md.md)
re='(.*)\!(.*\()\/\!\/([0-9a-z\.\-]+)(\).*)'
while [[ $testfile =~ $re ]]; do
    testfile=${BASH_REMATCH[1]}"!"${BASH_REMATCH[2]}${imagemap[${BASH_REMATCH[3]}]}${BASH_REMATCH[4]}
done

到目前为止一切顺利。

但是,如果他们成为了一个块引用或代码的一部分,那么我不想像这样捕获这些行,只有那些被Markdown解析为实际图像的行。

我认为我可以通过坚持开始图像放置的感叹号位于线的最开头来避免这种情况。这是我尝试过的正则表达式:

re='(.*)^\!(.*\()\/\!\/([0-9a-z\.\-]+)(\).*)'

不幸的是,当我这样做时,Bash似乎并不想识别插入符号。替换仍然有效,但即使代码行,它也会被替换。例如,这个Markdown文件:

![Alt text.](/!/image.jpg)

This image was placed with the following code:

    ![Alt text.](/!/image.jpg)

不幸的是变成了这个:

![Alt text.](http://images.com/an-example-image.jpg)

This image was placed with the following code:

    ![Alt text.](http://images.com/an-example-image.jpg)

它应该

![Alt text.](http://images.com/an-example-image.jpg)

This image was originally placed with the following code:

    ![Alt text.](/!/image.jpg)

我也尝试过使用换行符而不是插入符号:

re='(.*)[\n\r]+\!(.*\()\/\!\/([0-9a-z\.\-]+)(\).*)'

这也不起作用,所以我可能会错过一些关于Bash正则表达式的重要内容。

在这种情况下,我是否错误地使用了插入符号?如何捕获图像放置从行首开始的那些实例?

2 个答案:

答案 0 :(得分:1)

感谢Avinsah Raj在评论中给出了我的线索。我一开始看不到它,但似乎没有办法让Blee正则表达式中的Kleene明星非贪婪。 (如果这是错误的话,很高兴得到纠正。)

我发现如果我改变正则表达式,以便我们只在第一个感叹号之后和左括号之前查找可打印字符,那么捕获工作。它必须在之前太宽并且捕获换行符以在先前不相关的行上找到先前的感叹号。

所以正确的正则表达式是:

re='(.*^\!\[[[:print:]]+\]\()\/\!\/([0-9a-z\.\-]+)(\).*)'

有了这个,插入符就可以了,只找到一行开头的图像位置并相应地替换。

整个下午这让我很生气,非常感谢Avinsah!

答案 1 :(得分:0)

关于downvoting的风险,我建议你使用正则表达式,因为降价非常复杂。机会非常大,你总会错过一些方面,例如反引号,代码环境,自定义html代码中的代码,......

然而,您可以使用pandoc以更通用的格式(例如html)转换降价,然后使用例如xmllint来捕获图片网址:

pandoc -f markdown -t html | xmllint --html --xpath '//img/@src' -

如果您在给定示例中执行此操作,则会获得:

$ echo '![Alt text.](/!/image.jpg)' | pandoc -f markdown -t html | xmllint --html --xpath '//img/@src' -
 src="/!/image.jpg"

pandoc是一个旨在将所有类型的文档格式相互转换的程序。通过调用pandoc -f markdown -t html,您将降价转换为html。一种更容易解析的格式。

xmllint是一个查询xml文档的程序。在这种情况下,我们提供了查询//img/@src,意思是:

  

返回输入中所有src标记的所有<img>属性。