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

237

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

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

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

SMAN
источник

Ответы:

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"\)

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

darioo
источник
2
Команда find- самое семантическое решение этой проблемы XY. Объединение lsи grepдля этой цели кажется в лучшем случае хакерским. Это должен быть принятый ответ. (+1)
Эрик Сеастранд
4
@Eric Независимо от требований OP, инвертирование выражения grep полезно гораздо больше, чем поиск файлов. Я сомневаюсь, что именно поэтому большинство людей приходят сюда.
17
30

Добавьте -vопцию в вашу grepкоманду, чтобы инвертировать результаты.

Роб Соберс
источник
9
 grep "subscription" | grep -v "spec"  
Аня Ишмухаметова
источник
7

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

grep --help | grep invert

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

jmd_dk
источник