【问题标题】:Regex capture group works in Javascript and regex101, but not in sed正则表达式捕获组适用于 Javascript 和 regex101,但不适用于 sed
【发布时间】:2021-12-30 20:20:20
【问题描述】:

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

在我的浏览器控制台中:

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"

【问题讨论】:

  • 这和 bash 有什么关系?您正在使用 sed。
  • sed 使用扩展的 posix,它不适用于您的标准 pcre
  • 你不需要在正则表达式中转义"
  • 预期输出是什么?在第一个命令中,捕获组包含整个匹配项,因此您只需将其替换为自身,输出与输入相同。
  • 在第二个命令中,捕获组不包含",因此它删除了"

标签: javascript regex sed capture-group


【解决方案1】:

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

这意味着,你可以得到你的“匹配”

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

请参阅online demo

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

所有匹配但未捕获的内容都将被删除,因为您只要求print \1,即 Group 1 值(使用 ([^"|]+) 捕获)。

【讨论】:

  • 谢谢!我认为我不需要匹配捕获组之外的所有内容。但这确实成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多