私はそれを知っています
grep -rhI "# Active" > out.txt
検索されたディレクトリ内の任意の行を出力します# Active
が、.txtファイルの内容全体が欲しいので、例
例.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
grepすると、これらの.txtファイルに含ま# Active
れる行だけでなく# Active
、他のすべての行も出力されます。例:
出力.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
答え1
の非 GNU バージョンではgrep
、 が含まれない可能性が高いため-z
、または移植性が必要な場合...
grep -q pattern file && cat file
-q
出力を抑制しますが、通常通り、パターンマッチが見つかったかどうかに基づいて終了ステータスが設定されます。パターンマッチの場合はgrep
成功コードを返します。0
これは次のコードに相当します。真実これにより、cat
コマンドを実行できるようになります。
答え2
通常、grep は一致する行のみを表示します。
$ grep -rhI "# Active"
Line3 # Active
ファイル全体を表示するには、-z
フラグを追加します。
$ grep -rhIz "# Active"
Line1
Line2
Line3 # Active
Line4
Line5
etc
-z
は、grep に改行を「行」区切り文字として使用せず、代わりに NUL 文字を使用するように指示する GNU 拡張機能です。テキスト ファイルには一般に NUL 文字が含まれていないため、これは grep にファイル全体を 1 つの「行」であるかのように読み取るように指示する効果があります。その結果、一致するものがあれば、ファイル全体が印刷されます。
grep の BSD/OSX バージョンでは、NUL 入力オプションは使用できず、-z
別の意味になります。
その他のgrepオプション
-r
grep にファイルとディレクトリを再帰的に検索するように指示します。
-I
grepにバイナリファイルを無視するように指示する
-h
grep にファイル名を添付せずに一致を印刷するように指示します。
答え3
sed
代替:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
このスクリプトは、一致する行が見つかるまで古いバッファに行を蓄積しh
(そしてそれらを削除し)、一致する行が見つかるとx
バッファを変更して実行しn
(つまり、印刷して次の行を取得し)、入力がなくなるまで続けます。
答え4
複数のファイルに対して実行する場合:
cat `grep -rIl "# Active" *`
Grep はファイル名のリストを返し、cat はそれを印刷します。