Найти шаблон (ab)* используя grep
grep ab* filename.txt
Команда выше находит строки, которые начинаются с a
и заканчиваться любым числом b
"S. Например:
a
ab
abb
abb
Но как мне исправить мою команду, чтобы она нашла такие строки?
ab
abab
abababab
Я старался grep (ab)* filename.txt
, но он этого не сделает, потому что это так же, как (ab | (ab) | (ab))
,
2 ответа
grep (ab)* filename.txt
Приведенный выше не будет этого делать, потому что он такой же, как (ab | (ab) | (ab)).
Нет, это не сработает, потому что ()
специально для большинства оболочек, и вы получите синтаксическую ошибку:
$ grep (ab)* foo
bash: syntax error near unexpected token `('
Процитируйте свои выражения.
Сейчас, grep
по умолчанию использует базовые регулярные выражения (BRE). Чтобы сгруппировать часть выражения в BRE, вам нужно использовать \(...\)
:
$ echo xababx | grep -o '\(ab\)*'
abab
Или используйте расширенные регулярные выражения (ERE) или Perl-совместимые регулярные выражения (PCRE), где (...)
достаточно:
$ echo abab | grep -Eo '(ab)*'
abab
$ echo abab | grep -Po '(ab)*'
abab
Увидеть grep
Руководство для BRE против ERE.
$ more ~/tmp/test_grep.txt
ab
abab
abababab
abaab
aba
$ grep -e '^\(ab\)\+$' ~/tmp/test_grep.txt
ab
abab
abababab
-e
вариант заключается в использовании регулярного выражения. Выражение ^(ab)+$
с помощью которого ^
начать в начале строки, +
говорит повторить группу (ab)
и $
сказать до конца после (ab)
,