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

行に文字列が含まれている場合、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

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

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

その他のgrepオプション

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

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

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

関連情報