Saya ingin mencari teks yang dapat dibagi beberapa baris dalam file. Grep yang akan mengabaikan jeda baris dan mengembalikan rentang garis yang cocok.
misalnya saya akan mencari is an example file
, dan berharap itu dapat ditemukan di file berikut:
Ini adalah
sebuah
contoh file.
Tidak bergantung pada ruang depan atau belakang, sepenuhnya mengabaikan semua bentuk ruang putih mungkin yang terbaik (idealnya, memperlakukan urutan ruang putih sebagai ruang tunggal).
Salah satu solusi yang tidak ideal adalah tr '\n' ' ' | grep
, yang membedakan antara pertandingan dan non-pertandingan, tetapi tidak menunjukkan pertandingan, juga tidak menangani file besar dengan baik.
text-processing
grep
search
newlines
Nikana Reklawyks
sumber
sumber
isearch-forward
)/This\_sis
. Untuk lebih jelasnya::help \_s
.Jawaban:
GNU
grep
dapat melakukannyaUntuk memenuhi beberapa poin yang muncul dalam komentar ada beberapa modifikasi pada skrip:
Mengenai file besar saya tidak memiliki imajinasi keterbatasan memori tetapi dalam kasus masalah Anda bebas untuk menggunakan
sed
yang menyimpan tidak lebih dari 4-baris (karena 4 kata dalam pola) dalam memori (
\(\n.*\)\{3\}
).sumber
-z
opsi memberitahugrep
untuk memperlakukan baris baru sebagai karakter teks biasa, dan mencari byte byte untuk memisahkan catatan. Dalam file teks tanpa byte byte (yaitu, kasus khas),grep -z
akan memperlakukan seluruh file sebagai satu baris. Jadi (1) ini menimbulkan pertanyaan tentang seberapa baik ia dapat menangani file besar, dan (2) jika menemukan kecocokan, itu akan menulis seluruh file, tidak memberikan petunjuk tentang lokasi pertandingan. (3) OP mengatakan, "idealnya, memperlakukan urutan ruang putih sebagai ruang tunggal," jadi Anda harus menggunakan\s+
dan menambahkan-E
.-o
; Saya terus lupa tentang itu. Cara cerdas untuk menggunakannya. (1)grep
Jawaban baru Anda dimulai^[\n]*
; itu salah ketik untuk[^\n]*
. (2) kataku dengan\s+
sengaja.be\s*little
akan cocokbelittle
, dancare\s*less
akan cocokcareless
. Tapi saya kira itu masalah kecil. Dan, jika Anda tidak ingin menggunakan-E
, Anda dapat menggunakan "versi orang miskin"\s+
, yaitu\s\s*
,. (3)sed
Perintah yang bagus . Ini bisa gagal jika ada baris kosong (sehingga frasa empat kata dapat tersebar di lebih dari empat baris); Saya dapat memperbaikinya dengan menambahkans/\n\s*\n/\n/
.-E
Anda baja dapat digunakan+
dalam\s\+
bentuk. Garis-garis kosong di dalam pola tampaknya dibuat-buat.grep
mereka untuk frasa.Coba ini:
sumber
\s
5 kali jika mencari "ini pola yang sangat panjang"?\s
cocok dengan spasi, dan baris baru adalah "spasi".This\nis a very\nlong pattern
, dan saya tidak tahu di mana garis putus mungkin terjadi. Saya harus mencariThis\sis\sa\svery\slong\spattern
, kan? (yang menjadi membosankan karena panjang pola meningkat atau disisipkan dari tempat lain)pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
.