Jak odwrócić wyrażenie grep

237

Poniższe wyrażenie grep z powodzeniem wyświetla wszystkie pliki .exe i .html w bieżącym katalogu i podkatalogach.

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

Jak odwrócić ten wynik, aby wyświetlić listę tych, które nie są plikami .html lub .exe. (To znaczy !=.)

sMaN
źródło

Odpowiedzi:

337

Użyj opcji wiersza polecenia -vlub --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
źródło
4
Należy zauważyć, że -v/ --invert-matchniekoniecznie odwróci, czy kod powrotu grepwskazuje pomyślne wykonanie, ale zamiast tego dopasuje linie, które w innym przypadku nie byłyby dopasowane. Ci, którzy chcą odwrócić kod powrotu (tzn. Odnieść sukces, jeśli wszystkie wiersze nie pasują do wzorca, a nie co najmniej jeden), powinni skorzystać ! grep. Znajduje to zastosowanie w wyrażeniach warunkowych, np if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi. : .
Zyl
98
grep -v

lub

grep --invert-match

Możesz również zrobić to samo, używając find:

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

Więcej informacji tutaj .

Darioo
źródło
2
findKomenda jest najbardziej semantycznej Rozwiązaniem tego problemu XY. Łączenie lsi grepdo tego celu wydaje się w najlepszym razie hacking. To powinna być zaakceptowana odpowiedź. (+1)
Eric Seastrand
4
@Eric Niezależnie od wymagań PO, odwracanie wyrażenia grep jest przydatne do znacznie więcej niż wyszukiwania plików. Wątpię, że dlatego większość ludzi tu przyjeżdża.
byxor
30

Dodaj -vopcję do greppolecenia, aby odwrócić wyniki.

Rob Sobers
źródło
9
 grep "subscription" | grep -v "spec"  
Anja Ishmukhametova
źródło
7

Jak stwierdzono wielokrotnie, inwersję uzyskuje się poprzez -vopcję grep. Pozwól, że dodam (mam nadzieję, zabawną) notatkę, że mógłbyś to sam odkryć, przeglądając greptekst pomocy:

grep --help | grep invert

-v, - odwróć dopasowanie wybierz niepasujące linie

jmd_dk
źródło