用SED中的正则表达式匹配并替换![foo](/ bar /)

时间:2018-10-05 09:04:04

标签: regex bash sed pattern-matching posix

我正在尝试为SED写一个RegEx,以使其匹配并替换以下MarkDown文本:

![something](/uploads/somethingelse)

具有:

![something](uploads/somethingelse)

现在,在PCRE中,匹配模式为:

([\!]|^)(\[.*\])(\(\/bar[\/])

在Regex101上测试:

enter image description here

但在SED上无效。

在询问之前,我已经尝试过很多组合,但是由于我不是RegEx专家,所以我会发疯。

哪个是正确的SED正则表达式,用于匹配并分割该字符串,以便进行make the replacement with sed as described here

1 个答案:

答案 0 :(得分:1)

您所需的sed命令应使用-E选项运行,因为您的正则表达式符合POSIX ERE。也就是说,捕获括号应不转义,而括号必须转义(如在PCRE中一样)。

您可以使用

sed -E 's;(!\[.*])(\(/uploads/);\1(uploads/;g'

详细信息

  • (!\[.*])-捕获组1:
    • !-一个!字符(如果使用"...",则需要对其进行转义)
    • \[.*]-一个[,然后是0+字符,然后是]
  • (\(/uploads/)-捕获组2:
    • \(-一个(字符
    • /uploads/-一个/uploads/子字符串。

与POSIX BRE兼容的模式(当前模式的实际“快速修复”)看起来像

sed 's;\(!\|^\)\(\[.*](\)/\(uploads/\);\1\2\3;g'

请注意,\(...\)定义捕获组,(匹配文字(\|定义交替运算符。

详细信息

  • \(!\|^\)-捕获组1:!或字符串的开头
  • \(\[.*](\)-捕获第2组:一个[,然后是0个字符,然后是(
  • /-一个/字符
  • \(uploads/\)-捕获组3:uploads/子字符串

请参见online sed demo

;正则表达式定界符有助于消除在\之前转义的/个字符,并使模式更具可读性。