grep regex perilaku spasi

90

Saya memiliki file teks, berisi sesuatu seperti:

12,34 EUR 
 5,67 EUR
 ...

Ada satu spasi sebelum 'EUR' dan saya mengabaikan 0, XX EUR.

Saya mencoba:

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 !

Bisakah seseorang menjelaskan kepada saya, tolong, mengapa saya tidak bisa menggunakan \stapi \s*dan \s[E]cocok?

OS: Ubuntu 10.04, grep v2.5

Milde
sumber

Jawaban:

124

Ini terlihat seperti perbedaan perilaku dalam penanganan \santara grep 2.5 dan versi yang lebih baru (bug di grep lama?). Saya mengkonfirmasi hasil Anda dengan grep 2.5.4, tetapi keempat grep Anda berfungsi saat menggunakan grep 2.6.3 (Ubuntu 10.10).

catatan:

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

sedangkan

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

Mungkin lebih sedikit masalah (seperti \syang tidak didokumentasikan):

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

Saran saya adalah untuk menghindari menggunakan \s... penggunaan [ \t]*atau [[:space:]]atau sesuatu seperti itu sebagai gantinya.

Kamal
sumber
24
Atau hanya [:space:]untuk mantan. seperti ini:cat file | grep "[[:space:]]"
Kiril Kirov
tampaknya ini adalah bug di versi grep yang lebih baru (sudut pandang lain) menurut permintaan bug ini mail-archive.com/[email protected]/msg02686.html tetapi mengapa pernyataan terakhir cocok?
Milde
1
@Milde, perhatikan posting tindak lanjut mail-archive.com/[email protected]/msg02689.html di mana laporan bug itu ditandai tidak valid dan ditutup (jadi ini tidak dianggap sebagai bug di grep yang lebih baru).
Kamal
2
@Milde, tidak ada dokumentasi grep yang saya periksa (lama atau baru) yang benar-benar merujuk \ssama sekali. Saya akan mengatakan perilakunya "tidak ditentukan". Gunakan [: spasi:] sebagai gantinya, yang berfungsi seperti yang didokumentasikan di grep lama dan baru.
Kamal
terima kasih, saya akan menggunakan [: spasi:] di masa mendatang untuk menghindari masalah
Milde