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

Попробуй это $ echo 'this 1 2 3' | grep '[0-9]\+'

Чарльз Ма
источник
1
возможно, вам поможет опция "grep -E"
bortunac