代码之家  ›  专栏  ›  技术社区  ›  Andrea Ligios

匹配并替换[foo](/bar/)带SED中的Regex

  •  1
  • Andrea Ligios  · 技术社区  · 6 年前

    我正在尝试为SED编写正则表达式,以使其匹配并替换以下标记文本:

    ![something](/uploads/somethingelse)
    

    使用:

    ![something](uploads/somethingelse)
    

    现在,在 PCRE

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

    在Regex101上测试:

    enter image description here

    但在SED上它是无效的。

    我试过了 但我要发疯了,因为我不是正则表达式专家。

    为了 make the replacement with sed as described here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

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

    你可以用

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

    细节

    • (!\[.*]) -捕获组1:
      • ! ! 字符(如果您使用 "..." ,你需要逃离它)
      • \[.*] -a [ ,然后是任何0+个字符,然后 ]
    • (\(/uploads/) -第2组:
      • \( -a ( 烧焦
      • /uploads/ -安 /上传/ 子字符串。

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

    \(...\) ( 匹配文字 ( ,和 \| 定义替换运算符。

    细节

    • \(!\|^\) ! 或字符串开头
    • \(\[.*](\) [ ,然后0+个字符,然后 (
    • / -a / 烧焦
    • \(uploads/\) -第3组: uploads/ 子串

    看到了吗 online sed demo

    这个 ; regex分隔符有助于消除转义 \ / 使图案更具可读性。