Saya ingin mendapatkan kecocokan multi pola dengan AND di antara pola, yaitu setara dengan menjalankan beberapa greps secara berurutan:
grep pattern1 | grep pattern2 | ...
Jadi bagaimana cara mengubahnya menjadi seperti ini?
grep pattern1 & pattern2 & pattern3
Saya ingin menggunakan grep tunggal karena saya membangun argumen secara dinamis, jadi semuanya harus masuk 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 pertandingan ATAU multi-pola.
grep
regular-expression
Greenoldman
sumber
sumber
Jawaban:
agrep
dapat melakukannya dengan sintaks ini:Dengan GNU
grep
, ketika dibangun dengan dukungan PCRE, Anda dapat melakukan:Dengan ast
grep
:(menambahkan
.*
sebagai<x>&<y>
cocok string yang cocok baik<x>
dan<y>
tepat ,a&b
tidak akan pernah cocok karena tidak ada tali sehingga bisa menjadi baika
danb
pada saat yang sama).Jika polanya tidak tumpang tindih, Anda juga dapat melakukan:
Cara portabel terbaik mungkin dengan yang
awk
telah disebutkan:Dengan
sed
:Harap berhati-hati bahwa semua itu akan memiliki sintaks ekspresi reguler yang berbeda.
sumber
agrep
sintaks tidak bekerja untuk saya ... yang versi apakah itu diperkenalkan di?agrep
dapat ditemukan disertakan dengan glimpse / webglimpse . Mungkin Anda memiliki implementasi yang berbeda. Saya memiliki kesalahan untuk versi ast-grep, opsi untuk augex regexps adalah-X
, bukan-A
.agrep
0.8.0 di Fedora 23. Ini tampaknya berbedaagrep
dari yang Anda referensi.agrep
.awk '/p1/ && /p2/ {n++}; END {print 0+n}'
Anda tidak menentukan versi grep, ini penting. Beberapa mesin regexp memungkinkan beberapa pencocokan dikelompokkan oleh DAN menggunakan '&' tetapi ini adalah fitur non-standar dan non-portabel. Tapi, setidaknya GNU grep tidak mendukung ini.
OTOH Anda cukup mengganti grep dengan sed, awk, perl, dll. (Tercantum dalam urutan kenaikan berat). Dengan awk, perintahnya akan terlihat seperti
dan dapat dibangun untuk ditentukan dalam baris perintah dengan cara yang mudah.
sumber
awk
menggunakan ERE's, misalnya yang setaragrep -E
, yang bertentangan dengan BRE yang biasagrep
digunakan.awk
Regex disebut EREs, tetapi sebenarnya mereka agak istimewa. Berikut ini mungkin lebih banyak detail daripada yang dipedulikan siapa pun: wiki.alpinelinux.org/wiki/Regexawk
- hanya mengetahui lebih banyak lebih baik).{ print; }
bagian tersebut tidak benar-benar diperlukan atau berguna di sini.Jika
patterns
berisi satu pola per baris, Anda dapat melakukan sesuatu seperti ini:Atau ini cocok dengan substring alih-alih ekspresi reguler:
Untuk mencetak semua bukan tidak ada garis input dalam kasus yang
patterns
kosong, gantiNR==FNR
denganFILENAME==ARGV[1]
, atau denganARGIND==1
digawk
.Fungsi-fungsi ini mencetak garis-garis STDIN yang berisi setiap string yang ditentukan sebagai argumen sebagai substring.
ga
singkatan grep all dangai
abaikan case.sumber
Ini bukan solusi yang sangat baik tetapi menggambarkan "trik" yang agak keren
sumber
chained-grep()
ataufunction chained-grep
tidakfunction chained-grep()
: unix.stackexchange.com/questions/73750/…git grep
Berikut adalah sintaks menggunakan
git grep
menggabungkan beberapa pola menggunakan ekspresi Boolean :Perintah di atas akan mencetak garis yang cocok dengan semua pola sekaligus.
Periksa
man git-grep
bantuan.Lihat juga:
Untuk operasi ATAU , lihat:
sumber
ripgrep
Berikut ini contoh penggunaannya
rg
:Ini adalah salah satu alat grepping tercepat, karena itu dibangun di atas mesin regex Rust yang menggunakan automata terbatas, SIMD dan optimisasi literal agresif untuk membuat pencarian sangat cepat.
Lihat juga permintaan fitur terkait di GH-875 .
sumber
Inilah pendapat saya, dan ini berfungsi untuk kata-kata dalam banyak baris:
Gunakan
find . -type f
diikuti oleh sebanyak-exec grep -q 'first_word' {} \;
dan kata kunci terakhir dengan
-exec grep -l 'nth_word' {} \;
-q
quiet / silent-l
menunjukkan file dengan korek apiBerikut ini daftar nama file dengan kata-kata 'kelinci' dan 'lubang' di dalamnya:
find . -type f -exec grep -q 'rabbit' {} \; -exec grep -l 'hole' {} \;
sumber
Untuk menemukan SEMUA kata (atau pola), Anda dapat menjalankan grep di loop FOR . Keuntungan utama di sini, adalah mencari dari daftar regex .
Sunting jawaban saya dengan contoh nyata:
Sekarang mari kita jalankan di file ini:
sumber
ALL
operator, kode Anda berfungsi sebagaiOR
operator, bukanAND
. Dan btw. untuk itu (OR
) adalah solusi yang lebih mudah diberikan tepat dalam pertanyaan.AND
operator, artinya file tersebut hanya hit positif jika cocok dengan pola A dan pola B dan pola C dan ...AND
Dalam kasus Anda, file adalah hit positif jika cocok pola A atau pola B atau ... Apakah Anda melihat perbedaannya sekarang?AND
. Maka Anda harus menulis ulang skrip untuk dijalankan pada banyak file - maka mungkin Anda menyadari bahwa pertanyaan sudah dijawab dan upaya Anda tidak membawa apa pun ke meja, maaf.