2009-10-12 10 views
22

Parece que debe ser muy simple, pero el comportamiento awk gensub/gsub/sub siempre me ha sido incierto, y ahora simplemente no puedo hacer que haga lo la documentación dice que debería funcionar (y qué experiencia con un trillón de otras herramientas similares sugiere que debería funcionar). Específicamente, quiero acceder a "grupos capturados" desde una expresión regular en la cadena de reemplazo. Esto es lo que creo que la sintaxis de awk debe ser:GNU awk: acceder a los grupos capturados en el texto de reemplazo

awk '{ gsub(/a(b*)c/, "Here are bees: \1"); print; }' 

Eso se debe convertir "abbbc" en "Aquí están las abejas: bbb". No, al menos no para mí en Ubunutu 9.04. En cambio, el "\ 1" se representa como^A; es decir, el personaje con el código 1. No es lo que quiero, por supuesto. ¿Cómo hago esto?

Gracias.

Respuesta

20
echo abbc | awk '{ print gensub(/a(b*)c/, "Here are bees: \\1", "g", $1);}' 

Ver manual de here para ver la diferencia entre gsub y funciones predefinidas gensub

+3

Además, no sólo a gsub y funciones predefinidas gensub comportarse de manera diferente con respecto a devolver el valor, pero el conjunto \ 1 a \ 9 característica * * Sólo funciona con funciones predefinidas gensub. – Pointy

+0

Pruebe 'echo xxxabbcxxx' - la awk" solución "se rompe –

+0

@Alesandr, siéntase libre de proponer una nueva –

19

según el manual de gawk

funciones predefinidas gensub proporciona una característica adicional que no está disponible en el sub o gsub: la capacidad para especificar componentes de una expresión regular en el texto de reemplazo. Este se lleva a cabo mediante el uso de paréntesis en el expresión regular para marcar los componentes y luego especificando '\ n' en el texto de reemplazo , donde N es un dígito del 1 al 9.

Debe utilizar funciones predefinidas gensub, debe especificar "g", y debe obtener el resultado de gensub, ya que no se modifica in situ.

awk '{ r = gensub(/a(b*)c/, "Here are bees: \\1", "g"); print r; }' 
Cuestiones relacionadas