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

Jawaban:


337

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

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

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 .


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.



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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.