Saya perlu menemukan semua file yang berisi pola string tertentu. Solusi pertama yang muncul dalam pikiran adalah menggunakan find piped dengan xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Tetapi jika saya perlu menemukan pola yang menjangkau lebih dari satu baris, saya terjebak karena vanilla grep tidak dapat menemukan pola multiline.
Jawaban:
Jadi saya menemukan pcregrep yang merupakan singkatan dari Perl Compatible Regular Expressions GREP .
Misalnya, Anda perlu mencari file di mana variabel ' _name ' langsung diikuti oleh variabel ' _description ':
Kiat: Anda harus memasukkan karakter pemisah baris dalam pola Anda. Bergantung pada platform Anda, bisa jadi '\ n', \ r ',' \ r \ n ', ...
sumber
pcregrep
tersedia di mac denganbrew install pcre
-H
yang mencetak nama file sebelum setiap pertandingan:pcregrep -HM
.Kenapa kamu tidak pergi untuk awk :
sumber
awk
yang datang dengan kebanyakan sistem * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Anda dapat membuatnya lebih cantik dengan memberikan nomor baris lebar tetap:awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Berikut ini contoh penggunaan GNU
grep
:Lihat juga di sini
sumber
-z
sehingga tidak membagi pencarian pada satu baris, dan-o
untuk mencetak hanya bagian yang cocok.grep -rzl pattern *
, -rzo tidak bekerja)brew reinstall --with-pcre git
grep -P
juga menggunakan libpcre, tetapi jauh lebih banyak diinstal. Untuk menemukantitle
bagian lengkap dari dokumen html, bahkan jika itu mencakup beberapa baris, Anda dapat menggunakan ini:Karena proyek PCRE menerapkan standar perl, gunakan dokumentasi perl untuk referensi:
sumber
Ini adalah contoh yang lebih berguna:
Itu mencari tag judul dalam file html bahkan jika itu membentang hingga 5 baris.
Ini adalah contoh garis tak terbatas:
sumber
(?s)
ekspresi reguler Anda, seperti:"(?s)<html>.*</html>"
$
(pada akhir pola) untuk menandakan itu adalah akhir dari garis - meskipun itu tidak sama dengan membantu Anda menemukan beberapa pola garis. Lihat jugaglob(7)
. Anda mungkin juga menemukan situs web ini menarik: regular-expressions.infoDengan pencari perak :
Optimalisasi kecepatan pencari perak mungkin dapat bersinar di sini.
sumber
Anda dapat menggunakan alternatif grep sift sini (disclaimer: Saya penulis).
Ini mendukung pencocokan multiline dan membatasi pencarian untuk jenis file tertentu di luar kotak:
(Cari semua file * .py untuk pola regil multiline yang ditentukan)
Ini tersedia untuk semua sistem operasi utama. Lihatlah halaman sampel untuk melihat bagaimana itu dapat digunakan untuk mengekstraksi nilai multiline dari file XML.
sumber
Jawaban ini mungkin bermanfaat:
Regex (grep) untuk pencarian multi-line diperlukan
Untuk menemukan secara rekursif Anda dapat menggunakan flag -R (rekursif) dan --include (pola GLOB). Lihat:
Gunakan grep --exclude / - include sintaks untuk tidak grep melalui file-file tertentu
sumber
@Marcin: contoh awk tidak serakah:
sumber
sumber
Menggunakan
ex
/vi
editor dan opsi globstar (sintaksis mirip denganawk
dansed
):di mana
aaa
titik awal Anda, danbbb
teks akhir Anda.Untuk mencari secara rekursif, coba:
Catatan: Untuk mengaktifkan
**
sintaks, jalankanshopt -s globstar
(Bash 4 atau zsh).sumber