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

Match and Replace ![foo](/bar/) with Regex in SED

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

![something](/uploads/somethingelse)

与:

![something](uploads/somethingelse)

现在,在 PCRE 中,匹配模式将是:

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

在 Regex101 上测试:

但在 SED 上它是无效的。

我在提问之前尝试了很多 组合,但我快疯了,因为我不是 RegEx 专家。

为了 make the replacement with sed as described here?

匹配和拆分字符串 的正确 SED 正则表达式

您需要的 sed 命令应该是带有 -E 选项的 运行,因为您的正则表达式是 POSIX ERE 兼容的。也就是说,捕获括号应该是未转义的,而文字括号必须是转义的(如在 PCRE 中)。

您可以使用

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

详情

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

POSIX BRE 兼容模式(您当前模式的实际 "quick fix")看起来像

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

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

详情

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

online sed demo

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