\ N Не підтримується основними виразами grep?


119

Це не дає жодного результату. Як це?

$ echo 'this 1 2 3' | grep '\d\+'

Але це:

$ echo 'this 1 2 3' | grep '\s\+'
this 1 2 3

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3

2
Ніхто з цих не працює для мене (Solaris).
спред

Я теж ні. (Cygwin) Ти мав на увазі мати \+? Що це означає?
Ерік Вілсон

так, я на Ubuntu 10.04, використовую bash. Для BRE в грепі вам потрібно уникнути деяких символів. Спробуйте "Основні проти розширених регулярних виразів" у чоловічому грепі.
Ankur Agarwal

2
@FarmBoy: +в регулярному виразі означає "один або кілька попередніх токенів". У цьому випадку він уникає, тому що це синтаксис, необхідний grepдвигуну регулярних виразів за замовчуванням.
Daenyth

2
@FarmBoy: +потрібно уникнути, якщо ви використовуєте grep; якщо ви використовуєте egrep, це не робить. grep -Eеквівалентний egrep(принаймні, для версії GNU).
Кіт Томпсон

Відповіді:


196

grepрежим за замовчуванням - (iirc), регулярний вираз POSIX, і \dє pcre. Ви можете або перейти -Pдо gnu grep, для perge-подібних регулярних виразів, або використовувати [[:digit:]]замість \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1

10
Режим -EE BSD включає \ d. Але режим GNU grep's -E не робить. Це так вражаюче, що я шокований, що зараз я лише відкриваю це.
Кіт Тайлер

> Режим -E BSD grep включає \ d. Але режим GNU grep's -E не робить. Це так вражаюче, що я шокований, що зараз я лише відкриваю це. Це просто покусало мене на скрипті перевірки повідомлення про git commit повідомлення. Я був дуже здивований \ d був винуватцем.
austinbruch

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