Cara membalikkan ekspresi grep

237

Ekspresi grep berikut berhasil mendaftar semua file .exe dan .html di direktori dan sub direktori saat ini.

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

Bagaimana cara membalikkan hasil ini untuk mencantumkan yang bukan .html atau .exe sebagai gantinya. (Yaitu !=,.)

sMaN
sumber

Jawaban:

337

Gunakan opsi baris perintah -vatau --invert-match,

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
Eric Fortis
sumber
4
Perlu dicatat bahwa -v/ --invert-matchtidak harus membalik apakah kode pengembalian grepmengindikasikan eksekusi yang sukses, tetapi sebaliknya akan cocok dengan baris yang jika tidak akan dicocokkan. Mereka yang ingin membalikkan kode pengembalian (yaitu berhasil jika semua baris tidak cocok dengan pola, bukan setidaknya satu) harus digunakan ! grep. Temuan ini digunakan dalam ekspresi kondisional, misalnya: if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.
Zyl
98
grep -v

atau

grep --invert-match

Anda juga dapat melakukan hal yang sama menggunakan find:

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

Info lebih lanjut di sini .

darioo
sumber
2
The findperintah adalah solusi yang paling semantik untuk masalah XY ini. Menggabungkan lsdan grepuntuk tujuan ini tampaknya paling jelek. Ini harus menjadi jawaban yang diterima. (+1)
Eric Seastrand
4
@ Eric Terlepas dari persyaratan OP, membalikkan ekspresi grep berguna untuk lebih dari menemukan file. Saya ragu itulah alasan kebanyakan orang datang ke sini.
byxor
30

Tambahkan -vopsi ke grepperintah Anda untuk membalikkan hasilnya.

Rob Sobers
sumber
9
 grep "subscription" | grep -v "spec"  
Anja Ishmukhametova
sumber
7

Seperti yang dinyatakan beberapa kali, pembalikan dicapai oleh -vopsi untuk grep. Izinkan saya menambahkan catatan (semoga menghibur) yang bisa Anda temukan sendiri dengan membaca grepteks bantuan:

grep --help | grep invert

-v, --invert-match pilih jalur yang tidak cocok

jmd_dk
sumber