带有包含管道字符的正则表达式的 grep

XPL*_*1ON 3 linux bash grep regex command-line

我正在尝试使用包含管道字符的正则表达式进行 grep |。但是,它没有按预期工作。如下图所示,正则表达式与|inclusively不匹配。

在此处输入图片说明

这是我的 bash 命令

cat data | grep "{{flag\|[a-z|A-Z\s]+}}"

样本数据如下

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066
|{{flagicon|Kosovo}} ''[[Kosovo]]'' <ref name="KOS" group=Note>{{Kosovo-note}}</ref>
|{{flagicon|Somaliland}} [[Somaliland|Somaliland region]]
|{{flagicon|Palestine}} ''[[Palestinian Territories]]''{{refn|See the following on statehood criteria:
Run Code Online (Sandbox Code Playgroud)

预期的输出是

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066
Run Code Online (Sandbox Code Playgroud)

但是,使用Regex101.com对其进行测试,结果如预期。

AFH*_*AFH 8

似乎grep接受\|作为替代搜索表达式之间的分隔符(如|in egrep,其中\|匹配文字|)。

除此之外,你的表达还有其他问题:-

  • +仅在egrep(或grep -E) 中受支持。
  • \s[]字符组内不支持。
  • 我认为不需要|在字符组中。

所以以下适用于grep:-

grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp
Run Code Online (Sandbox Code Playgroud)

或者(感谢Glenn Jackman的意见):-

grep "{{flag|[a-zA-Z ]\+}}" <temp
Run Code Online (Sandbox Code Playgroud)

egrep{}字符有特殊的意义,所以他们需要进行转义: -

egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp
Run Code Online (Sandbox Code Playgroud)

请注意,我已经删除了不必要的cat.