Мое регулярное выражение не работает в grep

вот текст файла, с которым я работаю:

(4 spaces)Hi, everyone

(1 tab)yes

когда я запускаю эту команду - grep '^[[:space:]]+' myfile - он ничего не печатает в stdout.

почему он не соответствует пробелам в файле?

Я использую GNU grep версии 2.9.

4 ответов


существует несколько различных синтаксисов регулярных выражений. По умолчанию для grep называется basic синтаксис в документации grep.

у мужчины grep (1):

In basic  regular  expressions the meta-characters
?, +, {, |, (, and ) lose their special meaning; instead
use the backslashed versions \?, \+, \{, \|, \(, and \).

поэтому вместо + вы должны были ввести \+:

grep '^[[:space:]]\+' FILE

Если вам нужно больше энергии от ваших регулярных выражений, я также рекомендую вам взглянуть на синтаксис регулярных выражений Perl. Они обычно считаются наиболее выразительными. Существует библиотека C под названием PCRE, которая эмулирует их, и ссылки grep на нее. Для их использования (вместо базового синтаксиса) можно использовать grep-P.


можно использовать -E:

grep -E '^[[:space:]]+' FILE

Это включает расширенное регулярное выражение. Без него вы получаете BREs (basic regex), которые имеют более упрощенный синтаксис. В качестве альтернативы вы можете запустить egrep вместо с тем же результатом.


я обнаружил, что вам нужно избежать +:

grep '^[[:space:]]\+' FILE

попробовать grep -P '^\s+' вместо этого, при условии, что вы используете GNU grep. Это намного легче и лучше регулярные выражения.