странное поведение при сопоставлении шаблонов sed

ниже двух примеров ожидаемого поведения. Нет проблем
оба «xxx2», «xxx @» соответствуют «xxx». шаблон.

$ echo abc1xxx2abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p' abc1xxx2abc3 $ echo abc1xxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p' abc1xxx@abc3 

также ниже двух примеров ожидаемого поведения.
оба «xxx @», «xxxy» соответствуют «xxx». шаблон
но следующий символ «@» не соответствует шаблону, поэтому нет вывода

 $ echo abc1xxx@@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p' no output $ echo abc1xxxy@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p' no output 

но если бы я изменил «y» в приведенном выше примере на «x», тогда
вдруг шаблон сопоставляется, хотя следующий символ «@»
Я не могу понять это поведение

 $ echo abc1xxxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p' abc1xxxx@abc3abc4 

Давайте немного изменим ваш шаблон, чтобы мы могли видеть, что происходит (просто добавьте ^.* В начало так, чтобы вся строка ввода была заменена обратной ссылкой):

 $ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*/\1/p' xxx@abc3abc4 

Таким образом, он соответствует xxx@ за которым следует abc3 за которым следует abc4 . Это совершенно законно и ожидается, так как шаблон ищет три вхождения либо abc. или xxx. ,

Модель abc1x в начале вашей выходной линии никогда не подвергалась влиянию шаблона и поэтому также не заменялась заменой. Это было просто передано с входа.