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

然而,經過測試正規101.com,結果正如預期的那樣出來了。

答案1

看起來grep接受\|作為替代搜尋表達式之間的分隔符號(例如|in 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可能太複雜。

這裡我使用sedandawk來提取它,命令是

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

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

相關內容