поведінка пробілів регулярного виразу grep


87

У мене є текстовий файл, що містить щось на зразок:

12,34 EUR 
 5,67 EUR
 ...

Перед "EUR" є один пробіл, і я ігнорую 0, XX EUR.

Я намагався:

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 !

Хто-небудь може пояснити мені, будь ласка, чому я не можу використовувати, \sале \s*та \s[E]відповідні?

ОС: Ubuntu 10.04, grep v2.5

Відповіді:


122

Це виглядає як різниця у поведінці в обробці \sміж grep 2.5 та новішими версіями (помилка у старому grep?). Я підтверджую ваш результат за допомогою grep 2.5.4, але всі чотири ваші greps працюють під час використання grep 2.6.3 (Ubuntu 10.10).

Примітка:

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

тоді як

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

Можливо, менше проблем (як \sне задокументовано):

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

Моя порада , щоб уникнути використання \s... використовувати [ \t]*або [[:space:]]чи що - то , як він замість цього.


24
Або просто [:space:], для екс. ось так:cat file | grep "[[:space:]]"
Кирило Кіров

здається, це помилка в новій версії grep (інша точка зору) відповідно до цього запиту на помилку mail-archive.com/bug-grep@gnu.org/msg02686.html, але чому збігається остання заява?
Milde

1
@Milde, зверніть увагу на наступний пост mail-archive.com/bug-grep@gnu.org/msg02689.html, де цей звіт про помилку було позначено як недійсний та закритий (тому це не вважається помилкою в новіших grep-файлах).
Kamal

2
@Milde, жодна з документацій grep, яку я розглядав (стара чи нова), насправді взагалі не посилається \s. Я б сказав, що його поведінка "невизначена". Замість цього використовуйте [: space:], який працює так, як це зафіксовано у старому та новому grep.
Kamal

дякую, я буду використовувати [: space:] надалі, щоб уникнути проблеми
Milde
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.