Saya ingin mendapatkan kecocokan multi pola dengan DAN implicit implisit antar pola, yaitu setara dengan menjalankan beberapa grep secara berurutan:
grep pattern1 | grep pattern2 | ...
Jadi bagaimana cara mengubahnya menjadi sesuatu seperti?
grep pattern1 & pattern2 & pattern3
Saya ingin menggunakan grep tunggal karena saya membangun argumen secara dinamis, jadi semuanya harus muat dalam satu string. Menggunakan filter adalah fitur sistem, bukan grep, jadi itu bukan argumen untuk itu.
Jangan bingung pertanyaan ini dengan:
grep "pattern1|pattern2|..."
Ini adalah ATAU pencocokan multi pola.
Jawaban yang Diterima:
agrep
dapat melakukannya dengan sintaks ini:
agrep 'pattern1;pattern2'
Dengan GNU grep
, ketika dibangun dengan dukungan PCRE, Anda dapat melakukan:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
Dengan ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(menambahkan .*
sebagai <x>&<y>
cocok dengan string yang cocok dengan keduanya <x>
dan <y>
tepat , a&b
tidak akan pernah cocok karena tidak ada string yang bisa menjadi keduanya a
dan b
pada saat yang sama).
Jika polanya tidak tumpang tindih, Anda mungkin juga dapat melakukan:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
Cara portabel terbaik mungkin dengan awk
seperti yang telah disebutkan:
awk '/pattern1/ && /pattern2/'
Dengan sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Harap berhati-hati bahwa semua itu akan memiliki sintaks ekspresi reguler yang berbeda.