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 !=.)

Odpowiedzi:


337

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

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

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 .


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



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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.