Saya mencoba membangun pencarian grep yang mencari istilah tetapi tidak termasuk baris yang memiliki istilah kedua. Saya ingin menggunakan beberapa -e "pattern"
opsi tetapi itu tidak berhasil.
Ini adalah contoh dari perintah yang saya coba dan pesan kesalahan yang dihasilkannya.
grep -i -E "search term" -ev "exclude term"
grep: exclude term: No such file or directory
Menurut saya itu -v
berlaku untuk semua istilah / pola pencarian. Karena ini berjalan tetapi kemudian tidak termasuk search term
dalam hasil.
grep -i -E "search term" -ve "exclude term"
Jawaban:
Ke dan ekspresi dengan grep Anda memerlukan dua pemanggilan:
Jika istilah yang Anda cari bukan ekspresi reguler, gunakan pencocokan string tetap (
-F
) yang lebih cepat:sumber
Tanpa memohon grep dua kali, hanya ada satu cara yang bisa saya pikirkan untuk mencapai ini. Ini melibatkan Perl Compatible Regular Expressions (PCRE) dan beberapa pernyataan yang agak membingungkan .
Untuk mencari foo mengecualikan kecocokan yang mengandung bilah , Anda dapat menggunakan:
Begini cara kerjanya:
(?!bar)
cocok dengan apa pun yang tidak bar tanpa menggunakan karakter dari string. Kemudian.
mengkonsumsi satu karakter.^((?!bar).)*
ulangi di atas dari awal string (^
) ke akhir ($
). Ini akan gagal jikabar
ditemui pada titik tertentu, karena(?!bar)
tidak akan cocok.(?=^((?!bar).)*$)
pastikan string cocok dengan pola sebelumnya, tanpa mengkonsumsi karakter dari string.foo
mencari 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 rinci tentang bagaimana pandangan negatif beroperasi.
sumber
Jika Anda ingin melakukan ini dalam satu pass, Anda dapat menggunakan awk alih-alih grep.
Format:
echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'
Contoh:
echo "hello there" | awk '/hello/ && !/there/'
Tidak menghasilkan apa-apa.
echo "hello thre" | awk '/hello/ && !/there/'
Pengembalian: halo thre
echo "hllo there" | awk '/hello/ && !/there/'
Tidak menghasilkan apa-apa.
Untuk beberapa pola, Anda bisa menggunakan tanda kurung untuk mengelompokkannya.
Contoh:
echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'
Pengembalian: halo thre
echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'
Pengembalian: hi thre
echo "hello there" | awk '(/hello/ || /hi/) && !/there/'
Tidak menghasilkan apa-apa.
echo "hi there" | awk '(/hello/ || /hi/) && !/there/'
Tidak menghasilkan apa-apa.
sumber
ls --color=always | awk '/hello/ && !/goodbye/'
grep -R
dalam beberapa file kode menggunakan baris perintah Ubuntu.Dari eksperimen saya, tidak ada masalah untuk membuat banyak perbedaan jika Anda mengirimkan istilah pengecualian melalui
grep
ataused
. Sed memiliki beberapa fitur penggantian teks berguna lainnya yang sering saya gunakan untuk lebih memfilter put file log. Jadi saya akan menggunakan sed karena saya menggabungkan sejumlah filter pada sed.sumber
grep -F
alih - alihgrep -E
dan jangan gunakan-i
jika Anda tidak membutuhkannya.sed
;)