パイプ文字を含む正規表現による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

しかし、それをテストしたところ、翻訳元、予想通りの結果が出ました。

答え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|grepmay を使用するのは複雑すぎます。

ここで私はsedと を使ってawkそれを抽出します。コマンドは

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

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

関連情報