Как инвертировать выражение grep


237

Следующее выражение grep успешно перечисляет все файлы .exe и .html в текущем каталоге и подкаталогах.

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

Как мне инвертировать этот результат, чтобы перечислить те, которые не являются .html или .exe вместо этого. (То есть !=.)

Ответы:


337

Используйте параметр командной строки -vили --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

4
Следует отметить, что -v/ --invert-matchне обязательно перевернет, grepуказывает ли код возврата на успешное выполнение, а вместо этого совпадет со строками, которые в противном случае не были бы сопоставлены. Те, кто хочет инвертировать код возврата (т.е. преуспеть, если все строки не соответствуют шаблону, а не по крайней мере одна), должны использовать ! grep. Это находит применение в условных выражениях, например: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Зил

98
grep -v

или

grep --invert-match

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

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

Больше информации здесь .


2
Команда find- самое семантическое решение этой проблемы XY. Объединение lsи grepдля этой цели кажется в лучшем случае хакерским. Это должен быть принятый ответ. (+1)
Эрик Сеастранд

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



7

Как указано несколько раз, инверсия достигается с помощью -vопции grep. Позвольте мне добавить (надеюсь, забавное) примечание, что вы могли бы выяснить это самостоятельно, просматривая grepтекст справки:

grep --help | grep invert

-v, --invert-match выбрать несовпадающие строки

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.