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

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

私はそれを知っています

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オプション

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

-Igrepにバイナリファイルを無視するように指示する

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

答え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 はそれを印刷します。

関連情報