複数行のテキストが入力と一致するかどうかを確認したい。grep
近づいてきましたが、パターンを正規表現ではなくプレーンテキストとして解釈させる方法が見つかりませんでした。
Unix ユーティリティのみを使用して、これを行うにはどうすればよいですか?
使用grep -F
:
-F, --fixed-strings
PATTERNを、改行で区切られた固定文字列のリストとして解釈します。これらの文字列のいずれかが一致します。(
-F
POSIXで指定されています。)
編集:最初、私は質問を十分に理解していませんでした。パターン自体に改行が含まれている場合は、次の-z
オプションを使用します。
-z, --null-data Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) instead of a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.
私はそれをテストしました、複数行のパターンは機能しました。
からman grep
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
照合しようとしている入力文字列に空白行が含まれていない場合 (たとえば、改行が 2 つ連続していない場合)、次のことができます。
awk 'index( $0, "needle\nwith no consecutive newlines" ) { m=1 }
END{ exit !m }' RS= input-file && echo matched
改行が連続している文字列を検索する必要がある場合は、RS をファイルにない文字列に設定します。(RS を複数の文字に設定した場合、awk の結果は指定されないことに注意してください。ただし、ほとんどawk
の場合、文字列にすることができます。) 検索する文字列を正規表現にする場合、および awk が RS の設定をサポートしている場合複数の文字、次のことができます。
awk 'END{ exit NR == 1 }' RS='sought regex' input-file && echo matched