Untuk dan ekspresi dengan grep Anda memerlukan dua doa:
grep -Ei "search term" | grep -Eiv "exclude term"
Jika istilah yang Anda telusuri bukan ekspresi reguler, gunakan pencocokan string tetap (-F
) mana yang lebih cepat:
grep -F "search term" | grep -Fv "exclude term"
Singkat memohon grep dua kali, hanya ada satu cara yang dapat saya pikirkan untuk mencapai ini. Ini melibatkan Ekspresi Reguler yang Kompatibel dengan Perl (PCRE) dan beberapa pernyataan melihat-lihat yang agak retas.
Untuk menelusuri foo mengecualikan kecocokan yang berisi bilah , Anda dapat menggunakan:
grep -P '(?=^((?!bar).)*$)foo'
Begini cara kerjanya:
-
(?!bar)
cocok dengan apa pun yang bukan bar tanpa mengkonsumsi karakter dari string. Lalu.
menggunakan satu karakter. -
^((?!bar).)*
mengulangi hal di atas dari awal string (^
) sampai akhir ($
). Ini akan gagal jikabar
ditemui pada titik tertentu, sejak(?!bar)
tidak akan cocok. -
(?=^((?!bar).)*$)
memastikan string cocok dengan pola sebelumnya, tanpa menggunakan karakter dari string. -
foo
menelusuri foo seperti biasa.
Saya menemukan retasan ini dalam ekspresi Reguler untuk mencocokkan string yang tidak mengandung kata?. Dalam jawaban Bart Kiers, Anda dapat menemukan penjelasan yang jauh lebih mendetail tentang cara kerja pandangan negatif ke depan.
Jika Anda ingin melakukan ini dalam sekali jalan, Anda dapat menggunakan awk daripada grep.
Format:
echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'
Contoh:
echo "hello there" | awk '/hello/ && !/there/'
Tidak mengembalikan apa pun.
echo "hello thre" | awk '/hello/ && !/there/'
Pengembalian:halo tiga
echo "hllo there" | awk '/hello/ && !/there/'
Tidak mengembalikan apa pun.
Untuk beberapa pola, Anda dapat menggunakan tanda kurung untuk mengelompokkannya.
Contoh:
echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'
Pengembalian:halo tiga
echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'
Pengembalian:hai tiga
echo "hello there" | awk '(/hello/ || /hi/) && !/there/'
Tidak mengembalikan apa pun.
echo "hi there" | awk '(/hello/ || /hi/) && !/there/'
Tidak mengembalikan apa pun.