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