Grep kelimesi sınırları


22

GNU belgelerine göre:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

Benim / etc / fstab şöyle görünür:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Grep'in / media / fresh varlığı için TRUE / FALSE değerini döndürmesini istiyorum. Ben kullanmaya çalıştı \<ve \>ama işe yaramadı. Niye ya?

egrep '\</media/fresh\>' /etc/fstab

Çözüm:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Ama çirkin görünüyor.

Grepim 2.5.1


4
Sanırım /bir kelime karakteri olarak kabul edilmiyor, bu yüzden regex eşleşmiyor - "\ b alfanümerik bir diziden önce ve sonra" eşleşiyor "," bir kelimeden önce ve sonra "demekten daha
Felipe Alvarez

Yanıtlar:


27

\<ve \>sırasıyla boş bir dize bir kelimenin başında ve sonunda eşleşir ve yalnızca kelime oluşturan karakterler şunlardır:

[[:alnum:]_]

Kimden man grep:

Word-constituent characters are letters, digits, and the underscore.

Bu nedenle, Regex'iniz başarısız oluyor çünkü /geçerli bir kelime kurucu karakter değil.

Çevrenizdeki boşlukları kullanmak yerine, bir kelimeyle eşleşme -wseçeneğini kullanabilirsiniz grep:

grep -wo '/media/fresh' /etc/fstab

Örnek:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

Ben sorumu yayınladıktan sonra çok rakamlar. Neyi başarmak istediğime dair bir önerin var mı?
Felipe Alvarez

@FelipeAlvarez Düzenlemelerimi kontrol et ..
heemayl

1

Bu ve \<(ve ayrıca \b) bu problem sadece /kelime için değil , kelime dışı tüm karakterlere uygulanır. (yani [[:alnum:]]ve dışındaki karakterler _.)

Sorun şu ki regex motoru her zaman bir /sonraki çapa ararken olduğu gibi kelime dışı bir karakteri atlayacak \<. Bu yüzden kelime olmayan karakterleri /hemen sonra kullanmamalısınız \<. Yaparsanız, inşaat yoluyla hiçbir şey eşleşmez.

-wGrep seçeneğine bir alternatif , şunun gibi bir şey olurdu:

egrep "(^|\W)/media/fresh($|\W)"
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.