パイプ文字|
を含む正規表現で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 でテストしたところ、期待どおりの結果が得られました。
grep
は、代替検索式間の区切り文字として\|
を受け入れるようです(egrep
の|
のように、\|
はリテラル|
と一致します)。
それとは別に、あなたの表現には他の問題があります:-
+
はegrep
(またはgrep -E
)でのみサポートされています。\s
は、[]
文字グループ内ではサポートされていません。|
が必要だとは思いません。したがって、以下はgrep
に対して機能します:-
grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp
または( Glenn Jackman の入力に感謝します):-
grep "{{flag|[a-zA-Z ]\+}}" <temp
egrep
では、{}
文字は特別な意味を持つため、エスケープする必要があります:-
egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp
cat
の不要な使用を削除したことに注意してください。
リクエストはflag|
を含む行を抽出するようですが、grep
の使用は複雑すぎる可能性があります。
ここでは、sed
とawk
を使用してそれを削除します。コマンドは
sed -r -n '/flag\|/p' /tmp/temp
awk 'match($0,/flag\|/){print}' /tmp/temp