\x é expandido para o que é capturado no grupo de captura x th , os grupos de captura são numerados da esquerda para a direita com base na ocorrência da chave de abertura no regexp.
echo "abcd_aefghi" | sed -r "s/(a)(b)(c)(d)|(a)(e)(f)(g)//g;"
1 2 3 4 5 6 7 8
Esse regexp corresponde duas vezes. Uma vez em abcd (onde o grupo de captura 8 th não captura nada) e uma vez em aefg , onde o grupo de captura 8 th captura g . Portanto, abcd é substituído por nada e aefg com g e _ e hi são deixados intactos para que você obtenha _ghi como esperado.
Em:
sed -r "s/(a)(b)(c)(d)()|((a)(e)(f)(g))//g"
1 2 3 4 5 67 8 9 10
Você obtém _ehi porque o grupo 8 th agora é o (e) um.
sed -r "s/(a)(b)(c)(d)()||||i am Not comment, Whats going here?|||||||((a)(e)(f)(g))//g"
1 2 3 4 5 67 8 9 10
não é diferente. Exceto (embora isso não seja visível), por causa do || , haverá correspondências vazias entre h e i e uma extra no final (mais algumas com perl ).
redefinir números com base no operador de alternância não seria uma API muito útil. Se você deseja expandir para o que é correspondido pelo grupo de captura th em ambos os lados da alternação no seu exemplo, você sempre pode fazer:
sed -r 's/(a)(b)(c)(d)|(a)(e)(f)(g)//g'
1 2 3 4 5 6 7 8
O que lhe daria o mesmo que perl ':
perl -lpe 's/(?|(a)(b)(c)(d)|(a)(e)(f)(g))//g'
1 2 3 4 1 2 3 4
(onde poderia se expandir para o que (d) ou (g) capturou).