Yeni satırları yoksayarak dosyadaki metni nasıl arayabilirim?


11

Bir dosyadaki birkaç satıra bölünebilecek metin aramak istiyorum. Satır sonlarını yok sayan ve eşleşen satır aralıklarını döndüren bir grep.

Örneğin, ben arıyor is an example fileve aşağıdaki dosyada bulunmasını bekliyoruz:

Bu
bir
örnek dosyadır.

Önde gelen veya arkadaki boşluklara bağlı olmamak, tüm beyaz boşluk biçimlerini tamamen görmezden gelmek en iyisi olabilir (ideal olarak, herhangi bir beyaz boşluk dizisini tek bir boşluk olarak işlemek).


İdeal olmayan bir çözüm, tr '\n' ' ' | grepeşleşmeler ve eşleşmeler arasında ayrım yapan, ancak eşleşmeyi göstermeyen veya büyük dosyalarla ilgilenmeyen bir çözümdür .


SO hakkında (kesin cevap yok): stackoverflow.com/q/1858312/1449460
Nikana Reklawyks

Bir yan not olarak, emacs araması işi yapıyor gibi görünüyor ( isearch-forward)
Nikana Reklawyks

Yani Vim en yapar: /This\_sis. Daha fazla ayrıntı için: :help \_s.
lcd047

Bu satırı arama satırınızın sonuna ekleyin: tr -n "\ n" Bu işlem tüm yeni satırları silecektir. Umarım bu yardım!
Dan Howel

Yanıtlar:


12

GNU grepbunu yapabilir

grep -z 'is\san\sexample\sfile.' file

Yorumlarda ortaya çıkan bazı noktaları yerine getirmek için komut dosyasında bazı değişiklikler vardır:

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

Büyük dosyalarla ilgili olarak, bellek sınırlaması hayal gücüm yok ama sorun durumunda kullanmakta özgürsünüz sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

bellekte ( \(\n.*\)\{3\}) 4 satırdan fazla kalmaması (çünkü desende 4 kelime ).


5
Bildiğimden eminim, -zseçenek grepsatırlara normal metin karakterleri olarak davranmayı ve kayıtları ayırmak için boş bayt aramayı söyler . Boş bayt içermeyen bir metin dosyasında (örneğin, tipik durum), grep -ztüm dosyayı tek bir satır olarak ele alır. Yani (1) bu, büyük dosyaları ne kadar iyi işleyebileceği sorusunu gündeme getirir ve (2) bir eşleşme bulursa, tüm dosyayı yazarak maçın yeri hakkında hiçbir ipucu vermez. Ayrıca (3) OP, “ideal olarak, herhangi bir beyaz boşluk dizisini tek bir boşluk olarak ele almak” dedi, bu yüzden kullanmanız \s+ve eklemeniz gerekir -E.
G-Man, '

1
@ G-Man Yorumunuz için teşekkür ederiz. Lütfen düzenlenen cevaba bakınız.
Costas

1
(0) Ah -o,; Bunu unutmaya devam ediyorum. Kullanmanın akıllı yolu. (1) Yeni grepcevabınız başlıyor ^[\n]*; bu bir yazım hatası [^\n]*. (2) \s+Kasten söyledim .  be\s*littleeşleşecek belittleve care\s*lesseşleşecek careless. Ama sanırım bu küçük bir problem. Ve kullanmak istemiyorsanız -E, “fakir adamın versiyonu” \s+nu kullanabilirsiniz \s\s*. (3) Güzel sedkomut. Boş satırlar varsa başarısız olabilir (böylece dört kelimelik ifade dört satırdan fazla yayılabilir); Bunu ekleyerek düzelttim s/\n\s*\n/\n/.
G-Man

@ G-Man Teşekkür ederim. Yorumlarınız çok faydalı. Az ya da çok taşınabilir kod göndermeye çalıştım çünkü ünlü üyeler beni her zaman itiyor. Neyse bile olmadan -Ekullanabilmek için size çelik +içinde \s\+formu. Desenin içindeki boş çizgiler birbirinin aynısı gibi görünüyor.
Costas

Sayfalar bazı sistemlerde (veya yaptım ) gibi görünen RFC'ler - ISTR gibi sayfalandırılmış metin belgelerini düşünüyordum - ancak, daha fazla düşündüğümde, bu tür belgelerin çoğunun sayfa üstbilgileri ve / veya altbilgisi olduğunu düşünüyorum İfadeler için onlara umut vermeden önce çıkarılması gerekecek . grep
G-Man

7

Bunu dene:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT

\s"Bu çok uzun bir model" için arama yaparsam 5 kez yazmak zorunda mıyım?
Nikana Reklawyks

1
Evet: nokta \sboşluklarla eşleşir ve yeni satır bir "boşluk" dur.
lcd047

Yani, dosya ne ise This\nis a very\nlong patternve satır sonlarının nerede olabileceğini bilmiyorum. Aramam gerekecek This\sis\sa\svery\slong\spattern, değil mi? (desenin uzunluğu arttıkça veya başka bir yerden yapıştırıldığında sıkıcı hale gelir)
Nikana Reklawyks

2
Sonra böyle yapmak: pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file.
lcd047
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.