使用包含管道字符的正则表达式进行 grep

使用包含管道字符的正则表达式进行 grep

我尝试使用包含竖线字符 的正则表达式进行 grep |。但是,它没有按预期工作。正则表达式与|包含性不匹配,如下面的附加图片所示。

在此处输入图片描述

这是我的 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:

预期输出是

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066

然而,经过测试Regex101.com,结果正如预期的那样。

答案1

看起来grep接受\|作为备选搜索表达式之间的分隔符(例如|egrep\|与文字匹配的位置|)。

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

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

因此,以下适用于grep:-

grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp

或者(感谢格伦·杰克曼的输入):-

grep "{{flag|[a-zA-Z ]\+}}" <temp

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

egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp

请注意,我已删除了不必要的使用cat

答案2

看来您的请求是提取包含的行flag|,使用grep可能太复杂了。

在这里我使用sedawk提取它,命令是

sed -r -n '/flag\|/p' /tmp/temp

awk 'match($0,/flag\|/){print}' /tmp/temp

相关内容