我尝试使用包含竖线字符 的正则表达式进行 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
可能太复杂了。
在这里我使用sed
并awk
提取它,命令是
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp