2012-09-27 20 views
5

Me gustaría reemplazar todos {} en cierta línea con [], pero desafortunadamente solo puedo hacer coincidir la última ocurrencia de la expresión regular.sed solo reemplazando la última coincidencia de coincidencia - necesidad de coincidir con todos

que tienen un archivo de configuración que tiene la estructura de la siguiente manera:

entry { 
    id  123456789 
    desc This is a description of {foo} and was added by {bar} 
    trigger 987654321 
} 

tengo el siguiente sed, de los cuales es capaz de reemplazar el último partido 'bar', pero no 'foo':

sed s'/\(desc.*\){\(.*\)}/\1\[\2\]/g' < filename 

Anclaré esta búsqueda a la línea que contiene 'desc' ya que no me gustaría que reemplazara las llaves de delimitación de cada bloque de 'entrada'.

Por mi vida no puedo encontrar la manera de reemplazar todas las ocurrencias.

Se agradece cualquier ayuda, he estado aprendiendo todo el día y no he podido leer más tutoriales por temor a que mis córneas se rompan.

Gracias!

Respuesta

4

intente lo siguiente:

sed '/desc/ s/{\([^}]*\)}/[\1]/g' filename 

La búsqueda y reemplazo en el comando anterior, solamente se hará para las líneas que coincidan con la expresión regular /desc/, sin embargo no creo que esto es realmente necesario porque los procesos sed de texto una línea a la vez, por lo que incluso sin esto no estaría reemplazando llaves en el bloque 'entrada'. Esto significa que probablemente podría simplificar esto a lo siguiente:

sed 's/{\([^}]*\)}/[\1]/g' filename 

En lugar de .* dentro del grupo de captura se utiliza [^}]* que coincidirá con todo excepto llaves de cierre, de esa manera usted no tendrá partido a partir de la primera abriendo al último cierre.

Además, puede proporcionar el nombre del archivo como argumento final para sed en lugar de usar la redirección de entrada.

+0

Gracias F.J, ¡funcionó muy bien! (PD: puede marcar como respondido en 3 minutos al parecer :-) – halfpasthope

Cuestiones relacionadas