2012-04-20 13 views
7

A menudo me encuentro haciendo la misma coincidencia en la acción que el patrón, para acceder a alguna parte del registro de entrada, p. Ej.¿alguna forma de acceder a los grupos coincidentes en acción?

/^Compiled from \"(.*)\"$/ { 
    file_name = gensub("^Compiled from \"(.*)\"$", "\\1", "g"); 
    print file_name; 
} 

Por lo tanto, la coincidencia de expresiones regulares se realiza dos veces. ¿Hay alguna manera de que pueda acceder al \\1 en la acción sin hacer coincidir otra vez?

Estoy tratando de reducir la coincidencia de pattert y el código adicional.

+0

parece como respondida aquí: http://stackoverflow.com/questions/2957684/awk-access-captured-group-from-line-pattern – Slartibartfast

+0

@Slartibartfast ayuda. No encontré esa pregunta antes de publicarla, así que gracias. Aún así, según [this] (http://stackoverflow.com/a/4673336/18573) respondo tengo que usar el 'match ($ 0 ....' que es algo feo aunque realmente no –

Respuesta

7

Desafortunadamente, GAWK no tiene la función de arrastre de sed que usa un vacío.

sed '/\(patt\)ern/ {s//new\1/}' inputfile 

Sin embargo, puede alegrarse ya que las variables se han inventado recientemente y se pueden usar para este fin.

BEGIN { 
    pattern = "^Compiled from \"(.*)\"$" 
} 
$0 ~ pattern { 
    file_name = gensub(pattern, "\\1", ""); 
    print file_name; 
} 
+0

ya había estado usando variables pero estoy aceptando esto ya que responde mi pregunta. –

Cuestiones relacionadas