Как использовать egrep, чтобы найти повторяющуюся группу символов (например, abc-abc-abc)? - PullRequest
0 голосов
/ 15 февраля 2019

Я учусь использовать команду egrep, я хочу найти несколько слов с повтором 3 символа в одной строке (например, abc-abc-abc; ssd-ssd-ssd).

Я пробовал некоторые команды, такие как

egrep '[a-z][a-z][a-z]{3}' file 
grep -e'{([a-z][a-z][a-z]){3}}' file

, но не работает.просто напечатать все слово имеет 9 символов

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Ответ ( сложный пример с использованием групп захвата и счетчиков повторов ):

egrep '([a-z]{3})(-\1){2}'

Соответствует следующему шаблону с дефисом в качестве только допустимого разделителя.

abc-abc-abc
ssd-ssd-ssd
zab-zab-zab 
.
.
.

В приведенном выше примере есть два набора паренов (групп захвата);каждый захватывает свой совпадающий текст в свой буфер, соответствующий группе захвата.Нам нужно только заключить в скобки второе выражение соответствия, чтобы мы могли дать ему счетчик повторений и заинтересовать захваченный текст 2-й группы.

Более простой пример

Thisэто похожий случай, но легче понять.Он соответствует 3 одинаковым строчным буквам в строке:

egrep '([a-z])\1\1'

([a-z]) - это группа захвата, которая соответствует одной строчной букве и сохраняет соответствующий символ в буфере группы захвата.Примечание. Каждый \1 соответствует вновь захваченному тексту (в данном случае 1 соответствующий символ).

<strong>NOTE</strong>: Группа захвата соответствует символу первый последовательность, поэтому необходимы два дополнительных сопоставления с сохраненным текстом из первого совпадения, чтобы сопоставить три одинаковых символа в строке.Следующий пример идентичен приведенному выше, за исключением того, что он использует счетчик повторений (2) для повторения второго слагаемого два раза.

egrep '([a-z])\1{2}'

Я проверял это следующим образом:


$ echo "aaa" | egrep '([a-z])\1{2}'
aaa
$ echo "zzz" | egrep '([a-z])\1{2}'
zzz
$ echo "zaz" | egrep '([a-z])\1{2}'

примечание: нет выхода для третьей линии эха

Как работают группы захвата

НеэкранированныеКруглые скобки - это использование элементов выражения группы вместе для повторения в качестве группы или для выполнения над ними операции, но также приводит к тому, что сопоставленный текст захватывается во внутренний буфер.

Первая группа захвата,слева направо в регулярном выражении - \1, второе - \2, третье \3 ...

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

0 голосов
/ 15 февраля 2019

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

grep -e '\(\<[[:alnum:]]\{3\}\>\).*\<\1\>.*\<\1\>'

\<[[:alnum:]]\{3\}\> соответствует слову, составленному ровно из 3 буквенно-цифровых символов.\<\> гарантирует, что окружающие символы не являются буквенно-цифровыми.

\(...\) помещает совпадение в var \ 1 для последующего вызова

\<\1\> соответствует слову, значение которого точно совпадает со значениемзапоминающийся матч.

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