При использовании grep он выделяет любой текст в строке с соответствием вашему регулярному выражению.
Что делать, если я хочу этого поведения, но grep распечатывает все строки? Когда я просмотрел страницу grep man, я подошел пустой.
При использовании grep он выделяет любой текст в строке с соответствием вашему регулярному выражению.
Что делать, если я хочу этого поведения, но grep распечатывает все строки? Когда я просмотрел страницу grep man, я подошел пустой.
Используйте 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 по умолчанию. Возможно, вам не нужен этот флаг).
Вы можете убедиться, что все строки совпадают, но нечего выделять в несоответствующих матчах
egrep --color 'apple|' test.txt
Примечания:
egrep
может быть записано также grep -E
--color
обычно используется по умолчанию в большинстве дистрибутивов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 пропустил строки --
при совпадении контекста, но это было некоторое время, поэтому, возможно, я ошибаюсь.
Вы можете использовать выделение script https://github.com/kepkin/dev-shell-essentials
Он лучше, чем grep, потому что вы можете выделить каждое соответствие с ним собственный цвет.
$ command_here | highlight green "input" | highlight red "output"
Поскольку вы хотите, чтобы совпадения были выделены, это, вероятно, для потребления человеком (в отличие от подключения к другой программе, например), поэтому хорошим решением было бы использовать:
less -p <your-pattern> <your-file>
И если вам не нужна чувствительность к регистру:
less -i -p <your-pattern> <your-file>
Это также имеет преимущество наличия страниц, что приятно, когда приходится проходить через длинный вывод
Вы можете сделать это, используя только grep:
который дает вам следующее:
while read line ; do (echo $line | grep PATTERN) || echo $line ; done < inputfile
Если вы хотите напечатать "все" строки, есть простое рабочее решение:
grep "test" -A 9999999 -B 9999999
Если вы делаете это, потому что вам нужен больше контекста в вашем поиске, вы можете сделать это:
cat BIG_FILE.txt | less
Выполнение поиска в less
должно указывать на ваши условия поиска.
Или переведите вывод в свой любимый редактор. Один пример:
cat BIG_FILE.txt | vim -
Затем выполните поиск/выделение/замену.
Если вы ищете рекурсивно шаблон в каталоге, вы можете сначала сохранить его в файл.
ls -1R ./ | list-of-files.txt
И затем grep, или перетащите его в поиск grep
ls -1R | grep --color -rE '[A-Z]|'
Это приведет к отображению всех файлов, но покрасьте буквы с прописными буквами. Если вы удалите последний | вы увидите только совпадения.
Я использую это, чтобы найти изображения, названные плохо с верхним регистром, например, но обычный grep не показывает путь для каждого файла только один раз для каталога, поэтому таким образом я могу видеть контекст.
Возможно, это проблема XY, и то, что вы на самом деле пытаетесь сделать, это выделить появление слов, как они появляются в вашей оболочке. Если это так, вы можете использовать для этого эмулятор терминала. Например, в Konsole запустите Find (ctrl + shift + F) и введите свое слово. Затем слово будет выделяться всякий раз, когда оно происходит в новом или существующем выводе, пока вы не отмените функцию.