Bir grep ifadesi nasıl ters çevrilir


237

Aşağıdaki grep ifadesi, geçerli dizindeki ve alt dizinlerdeki tüm .exe ve .html dosyalarını başarıyla listeler.

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

Bunun yerine .html veya .exe olmayanları listelemek için bu sonucu nasıl tersine çevirebilirim. (Yani !=,.)

Yanıtlar:


337

Komut satırı seçeneğini kullanın -vveya --invert-match,

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

4
Unutulmamalıdır -v/ --invert-matchille dönüş kodu olsun çevirmek olmaz grepbaşarılı işletildiğini gösterir, ancak bunun yerine başka türlü eşleşti olmaz çizgileri eşleşecek. Dönüş kodunu ters çevirmek isteyenler (yani, tüm satırlar en az bir yerine desenle eşleşmiyorsa başarılı olmalıdır) kullanmalıdır ! grep. Bu bulgular, koşullu ifadelerde örneğin kullanın: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl

98
grep -v

veya

grep --invert-match

Aynı şeyi aşağıdakileri kullanarak da yapabilirsiniz find:

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

Daha fazla bilgi burada .


2
findKomut bu XY sorunun en semantik bir çözümdür. Birleştirmek lsve grepbu amaç için en iyi ihtimalle kaba gibi görünüyor. Bu kabul edilen cevap olmalı. (+1)
Eric Seastrand

4
@Eric OP'nin gereksinimleri ne olursa olsun, bir grep ifadesini tersine çevirmek, dosyaları bulmaktan çok daha fazlası için yararlıdır. Çoğu insanın buraya gelmesinin nedeni budur.
byxor

30

Sonuçları tersine çevirme -vseçeneğini grepkomutunuza ekleyin .



7

Birden çok kez belirtildiği gibi, tersine çevirme -vseçeneği ile elde edilir grep. grepYardım metnini kullanarak kendiniz anlayabileceğiniz (umarım eğlenceli) notu ekleyeyim :

grep --help | grep invert

-v, --invert-match eşleşen olmayan satırları seç

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.