代码之家  ›  专栏  ›  技术社区  ›  abalter

Regex捕获组适用于Javascript和regex101,但不适用于sed

  •  1
  • abalter  · 技术社区  · 4 年前

    在regex101中: https://regex101.com/r/FM88LA/1

    enter image description here

    在我的浏览器控制台中:

    x='"AbCd123|999"';
    "\"AbCd123|999\""
    x.match(/[^\""|]+/)
    Array [ "AbCd123" ]
    

    在shell中使用sed:

    (base) balter@winmac:~/winhome/CancerGraph/TCGA$ echo '"AbCd123|99999"' | sed -En 's/([^\"|]+)/\1/p'
    "AbCd123|99999"
    (base) balter@winmac:~/winhome/CancerGraph/TCGA$ echo '"AbCd123|99999"' | sed -En 's/\"([^|]+)/\1/p'
    AbCd123|99999"
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Wiktor Stribiżew    4 年前

    没关系,因为 sed 与一起使用的命令 -n 选项和 p 标志只打印不匹配的文本+成功替换的结果。

    也就是说,你可以用

    echo '"AbCd123|99999"' | sed -En 's/["|]*([^"|]+).*/\1/p'
    

    请参阅 online demo

    在这里,模式到达第一个不是 " | 具有 ["|]* ,然后 ([^"|]+) 部分捕获一个或多个字符,而不是 | ,然后 .* 匹配字符串的其余部分。

    所有匹配但未捕获的内容都将被删除,因为您只要求 p 打印 \1 ,第1组值(用捕获 ([^“|]+) )。

    推荐文章