webdevqa.jp.net

パイプ文字を含む正規表現を持つgrep

パイプ文字|を含む正規表現でgrepしようとしています。ただし、期待どおりに動作しません。以下の添付画像に示されているように、正規表現は|と包括的に一致しません。

enter image description here

これは私の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
XPLOT1ON

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の不要な使用を削除したことに注意してください。

5
AFH

リクエストはflag|を含む行を抽出するようですが、grepの使用は複雑すぎる可能性があります。

ここでは、sedawkを使用してそれを削除します。コマンドは

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

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