1つのgrepコマンドを使用して2つの異なる行にある2つの異なるフレーズを検索するにはどうすればよいですか?
例えば
1行目:これは甘いです。
2行目:レモン。
これを使用しましたが、結果はありません
grep "sweet.*lemon" file_type
1つのgrepコマンドを使用して2つの異なる行にある2つの異なるフレーズを検索するにはどうすればよいですか?
例えば
1行目:これは甘いです。
2行目:レモン。
これを使用しましたが、結果はありません
grep "sweet.*lemon" file_type
回答:
grep2つの異なる行に使用するには、両方のパターンを検索します
$ 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ラインに考えて...。あなたは.*「甘い」と「レモン」の間にあるすべてキャッチしますライン上を。次の行で改行を-P使用\nして"lemon"を取得しgrep、ファイルがnullで区切られていることを伝えると、次のようになります-z。
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-E拡張正規表現を使用します(|エスケープする必要なく、代替に文字を使用します)-An パターンの後に追加の行を印刷します。nは印刷する末尾の行数です-Pperlスタイルの正規表現を使用します(perlの正規表現サポートを改善grepするためpcregrepに、代わりに「実験的」にインストールします)。-z区切り文字としてヌル文字を使用します(この場合はふりをしgrepますが、私たちの言葉を取ります)-o 一致した部分のみを印刷します-o... ...編集済み
grep: The -P and -z options cannot be combined-例えばのgrep(GNU grepの)RHEL上の2.5.1
このような:
grep "sweet\|lemon"
grep「標準モード」、などの「特殊文字」で、デフォルト作品で|、+、*文字通りに解釈されない限り、それらはバックスラッシュでマスクしています。たとえば、この回答を参照してください。おそらく慣れている方法を使用するには、「特殊文字」をマスクして文字どおりに解釈する必要があるため、「拡張モード」(grep -E)に切り替える必要があります。たぶん、madneonは彼の答えについてもう少し詳しく説明することができたでしょう。例えば、OPが試みたものが一致したでしょうか?
grep -zP、コマンドは、この特定のケース(正確に二行からなるファイル)に働くだろう一行すべき通常の改行区切りのファイルを考える(マッチどこかがある場合)には、一般的には、そのいずれかのファイル全体の内容をダンプしますまたは何もありません; 通常、それは人々が使用するものではありませんgrep。