わかりました
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にファイル全体を単一の「行」であるかのように読み取るように指示します。したがって、一致するものがあれば、ファイル全体が印刷されます。
BSD / OSXバージョンのgrepでは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はそれを印刷します。