grep regex boşluk davranışı


90

Şunun gibi bir şey içeren bir metin dosyam var:

12,34 EUR 
 5,67 EUR
 ...

'EUR'dan önce bir boşluk var ve 0, XX EUR'u yok sayıyorum.

Denedim:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

Biri bana açıklayabilir mi lütfen, neden kullanamıyorum \sama \s*ve \s[E]eşleşti mi?

İşletim Sistemi: Ubuntu 10.04, grep v2.5

Yanıtlar:


124

Bu, \sgrep 2.5 ve daha yeni sürümler arasında bir davranış farkı gibi görünüyor (eski grep? De bir hata?). Sonucunuzu grep 2.5.4 ile onaylıyorum, ancak greplerinizin dördü de grep 2.6.3 (Ubuntu 10.10) kullanırken çalışıyor.

Not:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

buna karşılık

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

Muhtemelen daha az sorun ( \sbelgelenmediği gibi):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

Benim tavsiyem kullanarak kaçınmaktır \s... kullanımını [ \t]*veya [[:space:]]falan öyle yerine.


24
Ya da sadece [:space:]eski için. şunun gibi:cat file | grep "[[:space:]]"
Kiril Kirov

Bu hata isteğine göre grep'in yeni sürümünde (başka bir bakış açısı) bir hata gibi görünüyor mail-archive.com/bug-grep@gnu.org/msg02686.html ama son ifade neden eşleşiyor ?
Milde

1
@Milde, bu hata raporunun geçersiz ve kapalı olarak işaretlendiği mail-archive.com/bug-grep@gnu.org/msg02689.html yazısını not edin (bu nedenle bu, daha yeni grep'te bir hata olarak değerlendirilmez).
Kamal

2
@Milde, incelediğim grep belgelerinin hiçbiri (eski ya da yeni) aslında hiç bahsetmiyor \s. Davranışının "tanımsız" olduğunu söyleyebilirim. Bunun yerine eski ve yeni grep'de belgelendiği gibi çalışan [: boşluk:] kullanın.
Kamal

teşekkürler, sorunu önlemek için gelecekte [: space:] kullanacağım
Milde
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.