パイプ文字を含む正規表現で 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
しかし、それをテストしたところ、翻訳元、予想通りの結果が出ました。
答え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
may を使用するのは複雑すぎます。
ここで私はsed
と を使ってawk
それを抽出します。コマンドは
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp