Як перетворити вираз 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)
Eric Seastrand

4
@Eric Незалежно від вимог ОП, інвертування виразного вигляду корисно набагато більше, ніж пошук файлів. Сумніваюсь, що саме тому більшість людей приїжджають сюди.
byxor



7

Як зазначено кілька разів, інверсія досягається -vваріантом до grep. Дозвольте додати (сподіваюсь, кумедно) зауваження, що ви могли самі це зрозуміти, провівши grepтекст довідки:

grep --help | grep invert

-v, - невідповідні лінії виберіть невідповідні лінії

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.