\ D не поддерживается основными выражениями 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).
spraff 01

И я нет. (Cygwin) Вы хотели иметь \+? Что это значит?
Эрик Уилсон

да, я использую Ubuntu 10.04, использую bash. Для BRE в grep вам нужно экранировать некоторые символы. Попробуйте "Простые и расширенные регулярные выражения" в man grep.
Анкур Агарвал

2
@FarmBoy: +в регулярном выражении означает «один или несколько предыдущих токенов». В этом случае он экранирован, потому что это синтаксис, необходимый для grepмеханизма регулярных выражений по умолчанию.
Daenyth 01

2
@FarmBoy: +нужно экранировать, если вы используете grep; если вы используете egrep, это не так. grep -Eэквивалентно egrep(по крайней мере, для версии GNU).
Кейт Томпсон

Ответы:


196

grepрежим по умолчанию - регулярное выражение POSIX (iirc) и \dpcre. Вы можете либо передать -Pgnu grep для регулярных выражений, подобных Perl, либо использовать [[:digit:]]вместо \d.

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

10
Режим BSD grep -E включает \ d. Но режим -E GNU grep - нет. Это так вопиюще, что я в шоке, я просто обнаружил это сейчас.
Кейт Тайлер

> Режим BSD grep -E включает \ d. Но режим -E GNU grep - нет. Это так вопиюще, что я в шоке, я просто обнаружил это сейчас. Это просто укусило меня за скрипт проверки сообщения git commit. Я был очень удивлен, что виноват.
Остинбрух

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.