Tanpa perlu menginstal varian grep pcregrep , Anda dapat melakukan pencarian multibaris dengan grep.
$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c
Penjelasan:
-P aktifkan perl-regexp untuk grep (ekstensi ekspresi reguler yang kuat)
-z Perlakukan input sebagai sekumpulan baris, masing-masing diakhiri dengan nol byte (karakter ASCII NUL), bukan baris baru. Artinya, grep tahu di mana ujung garisnya, tetapi melihat inputnya sebagai satu garis besar. Hati-hati ini juga menambahkan karakter NUL tambahan jika digunakan dengan -o , lihat komentar.
-o cetak hanya cocok. Karena kita menggunakan -z , seluruh file seperti satu baris besar, jadi jika ada kecocokan, seluruh file akan dicetak; dengan cara ini tidak akan melakukan itu.
Di regexp:
(?s) aktifkan PCRE_DOTALL , yang artinya . menemukan karakter atau baris baru apa pun
\N temukan apa pun kecuali baris baru, bahkan dengan PCRE_DOTALL diaktifkan
.*? cari . dalam mode tidak serakah, yaitu berhenti sesegera mungkin.
^ temukan awal baris
\1 referensi balik ke grup pertama (\s* ). Ini adalah upaya untuk menemukan lekukan metode yang sama.
Seperti yang dapat Anda bayangkan, pencarian ini mencetak metode utama dalam C (*.c ) file sumber.
Saya tidak pandai grep. Namun masalah Anda dapat diselesaikan dengan menggunakan perintah AWK. Lihat saja
awk '/select/,/from/' *.sql
Kode di atas akan dihasilkan dari kemunculan pertama select sampai urutan pertama dari from . Sekarang Anda perlu memverifikasi apakah pernyataan yang dikembalikan memiliki customername atau tidak. Untuk ini, Anda dapat menyalurkan hasilnya. Dan bisa menggunakan awk atau grep lagi.