複数のgrepを正規表現と組み合わせる

複数のgrepを正規表現と組み合わせる

私はこのファイルを持っています:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

返信の前に数字が続く単語と数字で囲まれた文字を含む行を抽出したいと思います。したがって、私が望む結果は次のようになります。

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

このコードはgrep '[0-9] replies\|[0-9][a-z]\|Horse' file次を返します。

Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
8798jgjh

ただし、数字で囲まれていない8798jgjhため、出力には表示しないでください。jgjh

grep '[0-9] replies\|[0-9][a-z][0-9]\|Horse' file動作しません。それでは、正しい出力をどのように取得できますか?

答え1

これを使用できますgrep。複数の場所で数量子(BREで)を使用するという考えは、使用された\{1,\}グループ内の少なくとも1つの文字を一致させることです。ポータブルバージョンは

grep '[0-9]\{1,\}[[:space:]]\{1,\}replies\|Horse\|[0-9]\{1,\}[a-z]\{1,\}[0-9]\{1,\}' file

grepGNU grepなどのEREをサポートするバージョンでは、式にエスケープ文字を追加する必要はありません。

grep -E '[0-9]{1,}[[:space:]]+replies|Horse|[0-9]{1,}[a-z]{1,}[0-9]{1,}' file

[0-9]文字クラスグループをなどのロケールに依存しないグループに置き換えることができます。[a-z][[:digit:]][[:lower:]]

正規表現 - レビュー

答え2

GNUで使用できますgrep

$ grep 'Horse\|^[0-9]\+ replies$\|^[0-9]\+[^0-9]\+[0-9]\+$' file
10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

コマンドの問題は量子化されていないため、[a-z]1つの文字だけを探します。

答え3

Standard を使用すると、一致さgrepせる行に対して別の式をユーティリティに提供できます。

grep \
    -e 'Horse' \
    -e '[[:digit:]]\{1,\} replies' \
    -e '[[:digit:]]\{1,\}[[:alpha:]]\{1,\}[[:digit:]]\{1,\}' file

\{n,m\}前の式が少なくともn1回、最大1回一致するように強制しますm。これは、POSIX拡張正規表現と同様に、\{1,\}前の式が少なくとも1回一致することを意味します。+

答え4

Raku(以前のPerl_6)の使用

raku -ne '.put if .grep( m:i/ horse / | / <digit>+ <ws> replies / | / <digit>+ <alpha>+ <digit>+ / );'

入力例:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

出力例:

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

これはPerlプログラミング言語ファミリーに属するRakuを使ったソリューションです。 Raku(別名Perl6)の作業は2000年に始まり、PCRE(正規表現)の主な改訂版が含まれており、一部はそれをより読みやすく考えていました。

上記のコードは、複数の正規表現マッチングをgrep使用できるRakuのコマンドを使用します。この場合、ブールORで接続されます。最初のマッチャーは大文字と小文字を区別しない「副詞」を使用するため、大文字と小文字を区別しない一致を許可します。一致させたい場合は、それに応じて変更して副詞を削除してください。m/…/|horse:iHorse:i

もちろん、正規表現を書くときはm/ Horse /注意が必要です。 when の前に他の単語が続き、その間にスペースがある行だけを含めるだけです。この場合、その単語が適している可能性があります。Big HorseBlack HorseWhite HorseHorse-facedHorsem/ <alpha>+ <ws> Horse /

https://docs.raku.org/言語/regexes
https://raku.org

関連情報