Мое регулярное выражение не работает в grep - PullRequest
6 голосов
/ 21 марта 2012

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

(4 spaces)Hi, everyone

(1 tab)yes

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

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

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

Ответы [ 4 ]

6 голосов
/ 21 марта 2012

Существует несколько различных синтаксисов регулярных выражений. Значение по умолчанию для 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 .

2 голосов
/ 21 марта 2012

Вы можете использовать -E:

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

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

1 голос
/ 21 марта 2012

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

grep '^[[:space:]]\+' FILE
0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...