Grep'te yeni çizgi için bir kalıp nasıl verilir?


95

Grep'te yeni çizgi için bir kalıp nasıl verilir? Başlangıçta yeni satır, sonunda yeni satır. Normal ifade yolu değil. \ N gibi bir şey.


6
Ne istediğin belli değil. new line at the beginningboş bir satırdır ve new line at enddosyadaki her satıra uygulanır. Bir örnek gönderebilir misin?
PP

2
Aslında sadece kullanabilirsiniz $. Biraz sınırlıdır, ancak basit durumlarda kullanılabilir.
Krzysztof Jabłoński

Yanıtlar:


84

grep desenler tek tek satırlarla eşleştirilir, bu nedenle bir modelin girdide bulunan bir satırsonu ile eşleşmesinin bir yolu yoktur.

Ancak bunun gibi boş satırlar bulabilirsiniz:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

En azından GNU grep, grep satırlarını boş karaktere göre ayıran -z seçeneğine sahiptir. Ancak, yeni satır eşleşecek görmek için destek satırsonu, \ n desende görünmüyor hata raporu .
jarno

1
@jarno -P bayraklı desenlerde \ n destekler
rubystallion

92

pcregrepnormal yerine deneyin grep:

pcregrep -M "pattern1.*\n.*pattern2" filename

-Mseçenek olarak satırbaşıyla arayabilirsiniz yüzden, birden fazla satıra eşleşmesini sağlar \n.


22

Bu şekilde kullanabilirsiniz ...

grep -P '^\s$' file
  • -PPerl düzenli ifadeleri için kullanılır (bir POSIX uzantısı grep).
  • \sbeyaz boşluk karakterleriyle eşleşir; ardından gelirse *, boş bir satırla da eşleşir.
  • ^satırın başıyla eşleşir. $satırın sonuyla eşleşir.

2
-Pbir GNU oluşumudur. Durum gerektirdiğinde (genellikle önden / arkaya bak) onu kullanmakta sorun yok, ancak POSIX grep bunu sadece [[:space:]].
jordanm

1
FWIW, Solaris'in ve BSD'nin grep yönetim sayfalarında (diğerlerini kontrol etmemişler) için bir paragraf var -P. GNU zaten oldukça standarttır. :)
K3 --- rnc

1
Kılavuz sayfasından: [-P] Bu seçenek FreeBSD'de desteklenmemektedir.
Marián Černý

MacOsX için [-P] de yok: grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e pattern] [-f file] [--binary-files = değer] [--color [= ne zaman]] [--colour [= ne zaman]] [--context [= num]] [--label] [--line-buffered] [--null] [pattern] [file. ..]
Niccolò

@ Niccolò brew install grepBirkaç yönden üstün olan GNU grep'i edinmek isteyeceksiniz . apple.stackexchange.com/questions/193288/…
herdrick

19

Teşekkür Ben -z seçeneği hakkında bilmek @jarno ve ben -P seçeneği ile GNU grep kullanırken, öğrendim aralarında eşlemek \nmümkündür . :)

Misal:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Baskılar bar


1
Harika, yanıtta "@jarno" ile ilgili bildirim almadığımı unutmayın.
jarno

3
Bu harika! Paylaştığınız için çok teşekkür ederim!
Alicia Tang

6

Geçici çözümle ilgili olarak (taşınabilir olmayanları kullanmadan -P), yeni bir satır karakterini farklı bir karakterle geçici olarak değiştirebilir ve eski haline getirebilirsiniz, örneğin:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

Temel olarak tam eşleme için arıyor _foo_nerede _aracı \n(şimdiye __= \n\n). tr '_' '\n'Her desen zaten yeni satıra yazdırılacağından, onu geri çevirmeniz gerekmez , bu nedenle kaldırmak _yeterlidir.


Cehaletimi bağışlayın, ancak işlem ikamesi kullanmak henüz başka bir OLMAYAN posix uyumlu değil, dolayısıyla taşınabilir olmayan bir özellik mi? posix kabuğunda yapamadım <(p paste -sd_ file )?
humanityANDpeace

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.