grep に一致した行だけでなくすべての行を出力するように指示する

grep に一致した行だけでなくすべての行を出力するように指示する

次のようなファイルがあるとします。

$ cat test

test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4

デフォルトでは、grep検索語を含む各行を返します。

$ grep test test

test line 1
test line 2
test line 3 with two test words
test line 4

--colorパラメータを に渡すとgrep、検索式に一致する行の部分が強調表示されますが、式を含む行のみが返されます。ソース ファイル内のすべての行を出力しながら、一致を強調表示する方法はありますかgrep?

これを実現するための私の現在のひどいハック(少なくとも、一致する行が 10000 行以上連続していないファイルの場合)は次のとおりです。

$ grep -B 9999 -A 9999 test test

2つのコマンドのスクリーンショット

これを実現できない場合grep、同じ機能を提供する別のコマンドラインツールはありますか?私はackですが、そのためのオプションもないようです。

答え1

grep --color -E "test|$" yourfile

ここで行っているのは、$パターンとテスト パターンのマッチングです。明らかに$色付けするものがないので、テスト パターンのみが色付けされます。-E拡張正規表現マッチングをオンにするだけです。

次のように簡単に関数を作成できます。

highlight () { grep --color -E "$1|$" "${@:1}" ; }

答え2

ack --passthru --color string file

UbuntuとDebianではackの代わりにack-grepを使用してください。

ack-grep --passthru --color string file

答え3

これを行う別の方法きちんとそしてポータブル(受け入れられた回答のように交互に2つの正規表現を使用する以外に)はgrep、ヌルパターン(およびそれぞれヌル文字列)を介して行われます。これは、およびスイッチの
両方で同様に機能するはずです。-E-F標準に従って:

-E
    Match using extended regular expressions. 
    [...] A null ERE shall match every line.

そして

-F
    Match using fixed strings.
    [...] A null string shall match every line.

だから、走るだけの問題だ

grep -E -e '' -e 'pattern' infile

それぞれ

grep -F -e '' -e 'string' infile

答え4

ripgrep

ripgrepパラメータとともに使用します--passthru:

rg --passthru pattern file.txt

それは最速のgrepツール、それは上に構築されているのでRustの正規表現エンジン有限オートマトン、SIMD、積極的なリテラル最適化を使用して、検索を非常に高速化します。

--passthru- 一致する行と一致しない行の両方を印刷します。

同様の効果を得る別の方法は、パターンを空の文字列に一致するように変更することです。たとえば、 を使用して検索している場合、代わりにrg fooを使用するとrg "^|foo"、検索されたすべてのファイルのすべての行が出力されますが、foo の出現のみが強調表示されます。このフラグにより​​、パターンを変更せずに同じ動作が可能になります。

関連情報