Bagaimana cara melakukan pencarian multiline dalam waktu kurang?

18

Dalam less, dapatkah Anda mencari menggunakan /pola yang berisi carriage return dan newline? Saya tahu pola Anda dapat diakhiri dengan menggunakan garis $(dari Bagaimana cara menyertakan baris baru dalam pencarian dalam waktu kurang? ), Tapi saya perlu pola untuk mencocokkan teks yang mencakup beberapa baris.

Saya mencoba \n, tetapi itu hanya mencari nkarakter.

yonran
sumber
Sudahkah Anda mencoba \n+1 atau lebih baris baru?
Brock Hensley
Distribusi Linux mana, dan apakah Anda telah mendefinisikan variabel lingkungan "KURANG"?
harrymc
@harrymc Bagaimana hal itu membantu pencarian multiline?
sashoalm
Mengumpulkan informasi.
harrymc
2
Ini tidak mungkin, berdasarkan tinjauan kode sumber untuk less( search.c:search_range()). Operasi pencarian / pencocokan dilakukan pada satu baris yang dibatasi satu baris pada satu waktu, sehingga Anda tidak dapat mencocokkan antar batas garis. Lihat line.c:forw_raw_line()untuk implementasi "readline" sebagaimana dipanggil oleh search_range.
zackse

Jawaban:

7

Tidak mungkin untuk mencocokkan antar batas garis, karena fungsi pencarian di lessberoperasi pada satu baris yang dibatasi satu baris pada satu waktu. Ini adalah kasus terlepas dari implementasi regex sistem (GNU, POSIX, PCRE, dll.).

Harap dicatat bahwa saya tidak dapat menemukan repositori sumber resmi untuk pengembangan jalur utama less, tetapi untuk tujuan tinjauan kode di sini, tautan yang mengikuti berasal dari pohon contrib FreeBSD.

Lihat search.c: search_range () untuk implementasi operasi pencarian. Loop di dalamnya memanggil line.c: forw_raw_line () untuk mengambil blok konten baru yang dibatasi baris baru. Blok itu diteruskan ke match.c: match_pattern () di mana pola pencarian (ekspresi reguler) dijalankan.

Untuk mencocokkan beberapa baris, Anda harus menggunakan alat yang berbeda. Salah satu opsi adalah masuk ke editor Anda dan menggunakan kemampuan pencariannya seperti yang disarankan oleh orang lain. Anda dapat meminta editor dengan menekan vdi less.

Zackse
sumber
2

Tidak yakin bagaimana melakukannya less, tetapi Anda dapat melakukan hal yang sama vim.

http://vim.wikia.com/wiki/Search_across_multiple_lines

/PATTERN1\\_.\\{-}PATTERN2

Atom \\_.menemukan karakter apa pun termasuk end-of-line. Multi \\{-}cocok sesedikit mungkin.

Vam
sumber
1
Ini tidak menjawab pertanyaan, bagaimanapun, karena ini adalah tentang kurang, bukan vim. Itu harus menjadi komentar.
sashoalm
1
@sashoalm Ini masih merupakan upaya untuk menjawab, jadi saya akan memilihnya, dan melanjutkan. Orang yang mencari solusi mungkin tidak terikat untuk menggunakan satu alat khusus.
slhck
2

lessmenggunakan edsintaks regex dan sayangnya tidak mendukung pencocokan multiline.

https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html#ed-regular-expression-syntax

Saya berharap untuk menemukan itu juga, atau setidaknya menemukan apakah sintaks ini digunakan dalam less:

RE_DOT_NEWLINE Jika bit ini disetel, maka operator yang cocok dengan karakter apa pun cocok dengan baris baru; jika bit ini tidak diset, maka tidak.

Jadi saya bisa menggunakan .+pola untuk mencocokkan baris baru. Tapi tidak, tidak.

stimur
sumber