Выделите текст, похожий на grep, но не отфильтровывайте текст

При использовании grep он выделяет любой текст в строке с соответствием вашему регулярному выражению.

Что делать, если я хочу этого поведения, но grep распечатывает все строки? Когда я просмотрел страницу grep man, я подошел пустой.

Ответ 1

Используйте ack. Ознакомьтесь с его опцией --passthru здесь: ack. Он имеет дополнительное преимущество, позволяющее полные регулярные выражения perl.

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

Вы также можете сделать это с помощью grep следующим образом:

$ grep --color -E '^|pattern1|pattern2' file_name

$ command_here | grep --color -E '^|pattern1|pattern2'

Это будет соответствовать всем строкам и выделить шаблоны. ^ соответствует каждому началу строки, но не будет печататься/подсвечиваться, поскольку это не символ.

(Обратите внимание, что большинство настроек будут использовать --color по умолчанию. Возможно, вам не нужен этот флаг).

Ответ 2

Вы можете убедиться, что все строки совпадают, но нечего выделять в несоответствующих матчах

egrep --color 'apple|' test.txt 

Примечания:

  • egrep может быть записано также grep -E
  • --color обычно используется по умолчанию в большинстве дистрибутивов

Ответ 3

EDIT:

Это работает с OS X Mountain Lion grep:

grep --color -E 'pattern1|pattern2|$'

Это лучше, чем '^|pattern1|pattern2', потому что часть ^ чередования соответствует началу строки, тогда как $ соответствует в конце строки. Некоторые механизмы регулярных выражений не будут выделять pattern1 или pattern2, потому что ^ уже согласован и двигатель нетерпелив.

Что-то подобное происходит для 'pattern1|pattern2|', потому что механизм регулярных выражений отмечает, что пустая чередование в конце строки шаблона соответствует началу строки темы.

[1]: http://www.regular-expressions.info/engine.html

ПЕРВЫЙ РЕДАКТИРОВАНИЕ:

В итоге я использовал perl:

perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

Предполагается, что у вас есть ANSI-совместимый терминал.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Если вы застряли со странным grep, это может сработать:

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

Настройте номера, чтобы получить все нужные строки.

Второй grep просто удаляет посторонние строки --, вставленные в стиле BSD grep в Mac OS X Mountain Lion, даже если контекст совпадений совпадений перекрывается.

Я думал, что GNU grep пропустил строки -- при совпадении контекста, но это было некоторое время, поэтому, возможно, я ошибаюсь.

Ответ 4

Вы можете использовать выделение script https://github.com/kepkin/dev-shell-essentials

Он лучше, чем grep, потому что вы можете выделить каждое соответствие с ним собственный цвет.

$ command_here | highlight green "input" | highlight red "output"

enter image description here

Ответ 5

Поскольку вы хотите, чтобы совпадения были выделены, это, вероятно, для потребления человеком (в отличие от подключения к другой программе, например), поэтому хорошим решением было бы использовать:

less -p <your-pattern> <your-file>

И если вам не нужна чувствительность к регистру:

less -i -p <your-pattern> <your-file>

Это также имеет преимущество наличия страниц, что приятно, когда приходится проходить через длинный вывод

Ответ 6

Вы можете сделать это, используя только grep:

  • чтение строки строки по строке
  • соответствие шаблону в каждой строке и выделение шаблона с помощью grep
  • Если нет совпадения, выполните эхо-строку как

который дает вам следующее:

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile

Ответ 7

Если вы хотите напечатать "все" строки, есть простое рабочее решение:

grep "test" -A 9999999 -B 9999999
  • A = > После
  • B = > До

Ответ 8

Если вы делаете это, потому что вам нужен больше контекста в вашем поиске, вы можете сделать это:

cat BIG_FILE.txt | less

Выполнение поиска в less должно указывать на ваши условия поиска.

Или переведите вывод в свой любимый редактор. Один пример:

cat BIG_FILE.txt | vim -

Затем выполните поиск/выделение/замену.

Ответ 9

Если вы ищете рекурсивно шаблон в каталоге, вы можете сначала сохранить его в файл.

ls -1R ./ | list-of-files.txt

И затем grep, или перетащите его в поиск grep

ls -1R | grep --color -rE '[A-Z]|'

Это приведет к отображению всех файлов, но покрасьте буквы с прописными буквами. Если вы удалите последний | вы увидите только совпадения.

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

Ответ 10

Возможно, это проблема XY, и то, что вы на самом деле пытаетесь сделать, это выделить появление слов, как они появляются в вашей оболочке. Если это так, вы можете использовать для этого эмулятор терминала. Например, в Konsole запустите Find (ctrl + shift + F) и введите свое слово. Затем слово будет выделяться всякий раз, когда оно происходит в новом или существующем выводе, пока вы не отмените функцию.