2011-01-05 10 views

Respuesta

27

Aquí está un ejemplo sencillo:

$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/' 
ababcabc 
$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/g' 
ababab 
$ echo 'abcabcabc' | sed 's/\(ab\)\(c\)/\1d\2/g' 
abdcabdcabdc 

En el primer comando, sólo el primer partido se ve afectada. En el segundo comando, cada partida se ve afectada. En ambos casos, el \1 se refiere a los caracteres capturados por el paréntesis escapado.

En el tercer comando, se especifican dos grupos de captura. Se hace referencia a ellos usando \1 y \2. Se pueden usar hasta nueve grupos de captura.

Además del operador g (mundial) (o sin ella, el primer partido), se puede especificar un partido en particular:

$ echo 'aaaaaa' | sed 's/a/A/4' 
aaaAaa 
+0

¿Qué está haciendo \\ 1, es regex extendido? – Timo

+0

Aquí hay un ejemplo para \\ 1: 'sed -E-e" s/[^ /] {10} (\\. [^ \\.] +)? $/\\ 1/"' – Timo

+1

@Timo : '\ 1' inserta el contenido del primer grupo de captura, que es lo que coincide entre el primer conjunto de paréntesis. No sé si usted está preguntando en particular sobre el caso con barras diagonales dobles, pero parece funcionar ya sea que estén dobladas o no. No diría que es un caso de expresiones regulares extendidas porque hace lo mismo incluso cuando usas expresiones regulares básicas. –

10

\(...\) capturaría los caracteres especificados en el interior de los parens y \1 sería utilizado para hacer referencia al primer partido, esto es una parte de la expresión regular.

+1

Buena respuesta. Solo quería agregar que esto significa que el ejemplo específico citado elimina un espacio que sigue a un signo de coma o igual, porque '\ 1' devuelve lo que fue emparejado entre los parens, que no incluía el espacio. –

+0

Entonces, ¿se necesita/g si solo hace referencia al primer partido? –

+0

alias "referencias anteriores" – SiegeX