Найти шаблон (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),

Другие вопросы по тегам