Vamos alterar seu padrão um pouco para que possamos ver o que acontece (basta adicionar ^.*
ao início para que toda a linha de entrada seja substituída pela referência anterior):
$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*//p'
xxx@abc3abc4
Portanto, corresponde a xxx@
seguido por abc3
seguido por abc4
. Isso é perfeitamente legal e esperado, já que o padrão está procurando por três ocorrências de abc.
ou xxx.
.
O abc1x
no início de sua linha de saída nunca foi afetado pelo padrão e, portanto, também nunca foi substituído pela substituição. Acabou de ser passado da entrada.