Отобразить все результаты, но выделить совпадения поиска

Отобразить все результаты, но выделить совпадения поиска

В bash, если я хочу выполнить команду и отобразить только те строки вывода, которые соответствуют определенному шаблону, я могу передать ее по конвейеру grep, например

файл testfile

hello
there
my
friends

команда

$ cat testfile | grep 'hello'
hello #this will be highlightd

это выделит совпадение поиска и отобразит всю строку, на которую оно попадает. Я могу использовать -Aи -Bдля отображения строк до и после этой строки. Мой вопрос в том, возможно ли выполнить команду и отобразить весь вывод как обычно, но выделить совпадения поиска, как это делает grep? поэтому мой вывод будет

hello #highlighted
there
my
friends

решение1

Чтобы использовать Color GREP только для выделения совпавших шаблонов, но не для изменения вывода:

grep --color=always -e "^" -e "hello" testfile

Первый шаблон будет соответствовать всем строкам (все строки будут напечатаны), второй шаблон (и любые последующие шаблоны) приведут к тому, что совпадающий текст будет выделен цветом.

Поскольку первый шаблон соответствует всем строкам, но не соответствует печатному символу, он не добавляет никакого цветного выделения, поэтому он не ухудшает читаемость выделенного текста и не мешает ей.

решение2

Добавьте опцию -zк вашей команде GNU grep:

cat testfile | grep --color=always -z 'hello'

или короче

grep --color=always -z 'hello' testfile

решение3

Это работает как с GNU grep, так и с grep на FreeBSD:

grep --color=always 'hello\|$'

Он соответствует тексту "hello" или ( \|) непечатаемой нулевой строке в конце каждой строки ( $). Вот почему печатается каждая строка, но выделяется только "hello".

Скорее всего, вы уже --color=autoнастроили в своей оболочке. Тогда вам, скорее всего, не нужно указывать --color=always:

grep 'hello\|$'

Вы также можете использовать более простую версию, используя egrep(с расширенными регулярными выражениями), где |для выражения «или» не нужно экранировать:

egrep 'hello|$'

См. также аналогичный вопрос на StackOverflow:Цветной grep — просмотр всего файла с выделенными совпадениями

решение4

Вот решение с использованием ripgrep— современной, более простой в использовании (на мой взгляд) и гораздо более быстрой замены grep:

cat my-file | rg --passthru '<REGEX>'

Вы также можете легко настроить «цвет маркера»:

# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'

Видеть man rg(онлайн версия).


Для повседневного использования я создал псевдоним оболочки:

# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'

Теперь это так же просто cat my-file | hl '<REGEX>'.

Связанный контент