web-dev-qa-db-ja.com

2つの異なる行でgrepを使用する方法

単一のgrepコマンドを使用して、2つの異なる行にある2つの異なるフレーズを検索するにはどうすればよいですか?

例えば

1行目:これは甘いです。

2行目:レモン。

これを使用しましたが、結果はありません

grep "sweet.*lemon" file_type
13

2つの異なる行にgrepを使用するには、両方のパターンを検索します

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

または交互に使用する

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

パターンの次の行を取得するには、コンテキストオプションを使用できます

$ grep -A1 sweet file_type
This is a sweet
lemon.

ただし、複数行のパターンを明示的に検索している場合は、 grepは行を考慮しているため... です。 .*は、「sweet」と「lemon」の間にあるすべての行をキャッチします。 -Pを使用して改行に一致させ、grep\nで区切られたヌルであると伝えることにより、-zで次の行に「レモン」を取得できます。

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

ノート:

  • -E拡張正規表現を使用します(エスケープせずに|文字を交互に使用します)
  • -Anパターンの後に追加の行を印刷します。nは、印刷する末尾の行数です
  • -P Perlスタイルの正規表現を使用します(grepの「実験的」-Perl正規表現のサポートを改善するために、代わりにpcregrepをインストールします)
  • -z区切り文字としてヌル文字を使用します(この場合はふりをしますが、grepはWordを使用します)
  • -o一致した部分のみを印刷します
19
Zanna

このような:

grep "sweet\|lemon"
5
madneon