web-dev-qa-db-ja.com

改行を無視してファイル内のテキストを検索する方法は?

ファイル内で数行に分割されている可能性のあるテキストを検索したいのですが。改行を無視し、一致する行のスパンを返すgrep。

例えば私はis an example fileを検索していて、次のファイルで見つかると思います。

これは
an
サンプルファイル。

先頭または末尾のスペースに依存しないようにするには、すべての形式の空白を完全に無視するのが最適です(理想的には、一連の空白を単一のスペースとして扱う)。


理想的でない解決策の1つはtr '\n' ' ' | grepです。これは、一致と非一致を区別しますが、一致を表示せず、大きなファイルを適切に処理しません。

11

GNU grepができる

_grep -z 'is\san\sexample\sfile.' file
_

コメントで発生するいくつかのポイントを満たすために、スクリプトにいくつかの変更があります。

_ grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file
_

巨大なファイルに関しては、私はメモリの制限を想像できませんが、問題が発生した場合はsedを自由に使用できます

_sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file
_

メモリに4行以下(パターンでは4ワード)を保持する(\(\n.*\)\{3\})。

12
Costas

これを試して:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT
7
lcd047