Bagaimana cara mencari frasa melalui beberapa baris? Misalkan kita memiliki frasa "my ice tea" maka dapat dibungkus dengan file teks:
as js skdfh dfh djh sf my
ice tea.
grep tidak akan cocok karena ada baris baru di antaranya. Bagaimana saya mencocokkannya? Pola multiline lainnya adalahpattern1_\n_pattern2
Saya tahu cara termudah yang saya lakukan ATM hanya grep untuk satu bagian misalnya hanya es dengan bendera -A2 -B2 dan kemudian dalam output yang againg untuk misalnya teh. Tapi ini sangat membosankan. Jadi saya campur tangan tentang bagaimana Anda akan menyelesaikan ini.
Jawaban:
Anda dapat menginstal
pcregrep
(tersedia di sebagian besar repositori distro) - yang grep menggunakan perpustakaan pcre , yang tidak "Perl Regular Regular Expressions". Ini memiliki opsi baris perintah-M
yang memungkinkan Anda melakukan pencarian multiline - dari halaman manual :Jadi kamu bisa melakukannya
The
\s
adalah spasi, yang akan cocok\n
dan\r
dalam mode multiline, selain karakter spasi normal. Anda juga dapat mencocokkan karakter baris baru secara langsung, sehingga Anda bisa melakukannyasumber
grep -E
melakukan pola pcre??
,+
,{
,|
,(
, dan)
seperti biasa makna regex mereka tanpa harus memiliki\
di depan, seperti yang Anda lakukan jika Anda menggunakan grep standar. Begitugrep 'hello\s\+world' file
juga dengangrep -E 'hello\s+world' file
. Itu tidak melakukan PCRE. Adagrep -P
untuk ekspresi reguler perl, tetapi ini eksperimental (menurut halaman manual) dan saya pikir itu sedikit berbeda dari pcregrep ...-P
ketika saya berkata-E
, tetapi saya tidak menyadari itu berbeda.Saya mungkin akan melakukan pencarian menggunakan
vim
's:vimgrep
perintah. Ini bekerja dengan cara yang agak mirip dengangrep
tetapi mendukung vim RE dan jalur.Pada dasarnya Anda menjalankan sesuatu seperti
:vimgrep 'pattern1\npattern2' path/**
untuk pencarian rekursif, lalu ketik:copen
untuk membuka jendela yang lebih kecil berisi daftar kecocokan.vim
RE dapat melakukan sebagian besar semua yang dapat dilakukan PCRE, tetapi mereka berevolusi secara terpisah dari garis turunan reguler perl sehingga sebagian besar barang canggih bekerja secara berbeda. Fungsionalitas dasar mereka lebih mirip dengan RE dasar, tetapi mereka memiliki beberapa tambahan bagus yang tidak ditawarkan PCRE.Saya tidak yakin apakah mungkin untuk
:vimgrep
mengeluarkan data sepertigrep
halnya; Saya hanya pernah mencoba menggunakannya untuk navigasi di dalamvim
.:help vimgrep
dari dalamvim
untuk info lebih lanjut;:help pattern.txt
untuk info tentangvim
RE; untuk info lebih lanjut tentang jalur, lihat:help wildcards
.sumber
.vimrc
? Seharusnya lebih portabel daripadagrep
sehubungan dengan sistem operasi:vim
tidak memiliki "rasa POSIX", dan bekerja kurang lebih identik bahkan di bawah Windows. .................................................. ........................... Mungkin saja untuk menambahkan kualifikasi untuk memastikan bahwa mis. Jumlah "sihir" yang tepat digunakan pada RE, meskipun seperti yang saya mengerti ada aturan ketat yang tidak tertulis untuk meninggalkan opsi itu sendiri.find.exe
bukangrep
). Ada pertanyaan lain dalam beberapa minggu terakhir yang memiliki masalah itu.:vimgrep
atau:grep
? Dari:help grep
: "Keuntungan dari grep internal [yaitu:vimgrep
] adalah ia bekerja pada semua sistem dan menggunakan pola pencarian Vim yang kuat."Grep hanya bekerja pada satu baris pada satu waktu, tetapi Anda dapat menggunakan awk untuk mencetak garis yang cocok dengan berbagai pola:
itu akan cocok dengan apa pun, bukan hanya baris baru di antara kedua pola
sumber
Untuk mendapatkan hasil maksimal dari unix, Anda perlu memanfaatkan pipa. Anda dapat melakukannya di dataran
grep
menggunakan pipa (tidak perlu tee):Yang menurut saya tidak membosankan.
sumber