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.