web-dev-qa-db-ja.com

1行に文字列が含まれている場合、Grepは.txtファイル全体を保持(出力)します

そんなこと知ってる

grep -rhI "# Active" > out.txt 

検索されたディレクトリ内で# Activeを含む行を出力しますが、.txtファイルの内容全体が必要なので、例

example.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

したがって、# Activeをgrepした場合、これらの.txtファイル内の# Activeを含む行だけでなく、他のすべての行も出力したいとします。例

output.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc
4
UserExample

GNU以外のバージョンのgrepの場合、-zがありそうにないか、移植性が必要な場合...

grep -q pattern file && cat file

-qは出力を抑制しますが、通常、パターン一致が見つかったかどうかに基づいて終了ステータスが設定されます。パターンマッチを使用すると、grepは成功コード0を返します。これはtrueと同等であり、catコマンドを実行できます。

12
B Layer

通常、grepは一致する行を表示します。

$ grep -rhI "# Active"
Line3 # Active

ファイル全体を表示するには、-z 国旗:

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-zはGNU拡張子で、改行を「行」の区切り文字として使用せず、代わりにNUL文字を使用するように指示します。通常、テキストファイルにはNUL文字が含まれていないため、ファイル全体を単一の「行」であるかのように読み取るようにgrepに指示する効果その結果、一致する場合、ファイル全体が印刷されます。

BSD/OSXバージョンのgrepでは、NUL入力オプションは使用できず、-zは別の意味です。

その他のgrepオプション

-rは、ファイルとディレクトリを再帰的に検索するようにgrepに指示します。

-Iバイナリファイルを無視するようにgrepに指示します

-hは、ファイル名を添付せずに一致を印刷するようにgrepに指示します。

8
John1024

sed代替:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

このスクリプトは、一致する行が見つかるまでholdバッファーに行を蓄積して(そしてそれらを削除して)機能します。一致する行に出会うと、バッファーがe xchangesしてnが実行されます(つまり、print&入力がなくなるまで次の行を取得します。

3
don_crissti

複数のファイルで実行する場合:

cat `grep -rIl "# Active" *`

Grepはファイル名のリストを返し、catはそれらを出力します。

1
ChatterOne