Ketika saya mengeksekusi ls /directory | grep '[^term]'
di Bash saya mendapatkan daftar reguler, seolah-olah grep
perintahnya entah bagaimana diabaikan. Saya mencoba hal yang sama dengan egrep
, saya mencoba menggunakannya dengan tanda kutip ganda dan tunggal, tetapi tidak ada hasil yang lebih baik. Ketika saya mencoba, ls /directory | grep '^[term]
saya mendapatkan semua entri dimulai dengan istilah - seperti yang diharapkan.
Saya telah mencoba perintah ini di editor online, di mana saya dapat menguji regex saya dan itu berfungsi sebagaimana mestinya. Tapi tidak di Bash. Jadi itu berfungsi dalam simulasi, tetapi tidak dalam kehidupan nyata.
Saya bekerja di Crunchbang Linux 10. Saya harap ini adalah informasi yang cukup dan saya menantikan setiap petunjuk, karena gagal mengeksekusi pada tingkat dasar seperti itu dan membuang waktu berjam-jam benar-benar membuat frustrasi!
grep
baris dimulai dengan istilah. Atau Anda ingin melihat baris yang tidak mengandung istilah sama sekali?Jawaban:
Apakah Anda yakin apa yang Anda inginkan sedang terjadi? Ketika Anda menjalankan
ls /directory | grep '[^term]'
Anda pada dasarnya memahami untuk tidak ter huruf. Ini berarti jika suatu file memiliki huruf lain dalam namanya itu akan tetap muncul di outputls
. Ambil direktori berikut sebagai contoh:Sekarang jika saya menjalankan
ls |grep '^[brav]'
saya mendapatkan yang berikut:Seperti yang Anda lihat, saya tidak hanya mendapatkan
brave
danbravo
saya juga mendapatalpha
karena kelas karakter[]
akan mendapatkan surat dari daftar itu.Akibatnya, jika saya menjalankan
ls |grep '[^brav]'
saya akan mendapatkan semua file yang tidak mengandung karakter brav di mana saja dalam nama.Jika Anda perhatikan itu termasuk seluruh daftar direktori karena semua file memiliki setidaknya satu huruf yang tidak termasuk dalam kelas karakter.
Jadi seperti yang dikatakan Kanvuanza, untuk memahami kebalikan dari "istilah" yang bertentangan dengan karakter
t e r m
Anda harus melakukannya menggunakangrep -v
.Contohnya:
Juga jika Anda tidak ingin file yang memiliki karakter apa pun di kelas digunakan
grep -v '[term]'
. Itu akan membuat file tidak muncul yang memiliki karakter tersebut. (Jawaban Kanvuanza)Contohnya:
Seperti yang Anda lihat tidak ada file yang terdaftar karena semua file dalam direktori ini termasuk setidaknya satu huruf dari kelas itu.
Tambahan:
Saya ingin menambahkan bahwa menggunakan PCRE dimungkinkan untuk menggunakan hanya regex untuk memfilter menggunakan ekspresi negate. Untuk melakukan ini, Anda akan menggunakan sesuatu yang dikenal sebagai negatif melihat-depan regex:
(?!<regex>)
.Jadi dengan menggunakan contoh di atas, Anda dapat melakukan sesuatu seperti ini untuk mendapatkan hasil yang Anda inginkan tanpa menggunakan
grep
flag.Untuk mendekonstruksi regex itu, pertama-tama cocok pada awal baris
^
dan kemudian mencari string yang tidak cocokbrav
untuk diikuti sesudahnya. Hanyaalpha
,,charlie
dandelta
cocokkan sehingga hanya itu yang dicetak.sumber
-v
pilihan. Terima kasih atas dukunganmu! Pertanyaan ini benar-benar merusak sore saya, di mana jawaban Anda mencerahkan malam saya!negative look-ahead regex
.Saya kira
grep -v
bendera itu melakukan apa yang Anda inginkan. Dari halaman manual :Anda dapat menggunakan
ls /directory | grep -v [term]
untuk mencetak garis yang tidak cocok.sumber
[^abc]
Tapi saya cukup yakin bahwa grep tidak mendukung negasi kelas, kecuali beberapa yang standar (mis.[[:^digits:]]
). Dukungan grep untuk negasi mengerikan !grep
penanganan kelas karakter tidak masalah. Itu hanya berarti sesuatu yang sangat berbeda dari apa yang Anda (salah) mengerti.[abc]
berarti salaha
,b
atauc
;[^abc]
berarti apa pun kecuali di atas. Itu adalah satu karakter.