\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).