
次のようなファイルがあるとします。
$ 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
これを実現できない場合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 の出現のみが強調表示されます。このフラグにより、パターンを変更せずに同じ動作が可能になります。