そんなこと知ってる
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
GNU以外のバージョンのgrep
の場合、-z
がありそうにないか、移植性が必要な場合...
grep -q pattern file && cat file
-q
は出力を抑制しますが、通常、パターン一致が見つかったかどうかに基づいて終了ステータスが設定されます。パターンマッチを使用すると、grep
は成功コード0
を返します。これはtrueと同等であり、cat
コマンドを実行できます。
通常、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
は別の意味です。
-r
は、ファイルとディレクトリを再帰的に検索するようにgrepに指示します。
-I
バイナリファイルを無視するようにgrepに指示します
-h
は、ファイル名を添付せずに一致を印刷するようにgrepに指示します。
sed
代替:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
このスクリプトは、一致する行が見つかるまでh
oldバッファーに行を蓄積して(そしてそれらを削除して)機能します。一致する行に出会うと、バッファーがe x
changesしてn
が実行されます(つまり、print&入力がなくなるまで次の行を取得します。
複数のファイルで実行する場合:
cat `grep -rIl "# Active" *`
Grepはファイル名のリストを返し、catはそれらを出力します。