Duplicar palabras seleccionadas con sed y reemplazarlas

Duplicar palabras seleccionadas con sed y reemplazarlas

Tengo que modificar un documento que contiene datos xml; una modificación con la que no pude configurar sed.

Tengo que modificar las siguientes expresiones de:

<Bild href_fmt="Bilder/Bildschirmfoto%202012-06_fmt.jpeg" 
href="file:///user/folder/Desktop/Bildschirmfoto%202012-06-18%20um%2013.17.45.png"></Bild>

a:

<a href="http://test.server.at/media/somefolder/Bildschirmfoto%202012-06_fmt.jpeg" 
target="_blank"><img src="http://test.server.at/media/somefolder/Bildschirmfoto%202012-06_fmt.jpeg" 
alt="" width="350" height="" /></a>

Mi problema: no pude duplicar Bildschirmfoto%202012-06_fmt.jpegpara generar la nueva entrada correcta. La etiqueta HTML está en algún lugar de la línea, por lo tanto no puedo duplicar toda la línea...

¿Cómo puedo hacer esto con sedotros comandos de Linux?

Respuesta1

sed 's@.*href_fmt="[^/]*/\([^"]*\)".*@<a href="http://test.server.at/media/somefolder/\1target="_blank"><img src="http://test.server.at/media/somefolder/\1" alt="" width="350" height="" /></a>@'

Necesitamos extraer el nombre de la imagen que está dentro href_fmt="Bilder/Bildschirmfoto%202012-06_fmt.jpeg". por lo tanto, antes que nada escribiremos un patrón para esto:

.*href_fmt="[^/]*/\([^"]*\)".*

donde .*coincide con cualquier cosa antes de href_fmt="
href_fmt="coincide href_fmt="=) [^/]*/coincide con el nombre del directorio Bilder/ \([^"]*\)coincide con el nombre de nuestra imagen. \(\)se usa para hacer un grupo y usarlo como \1en el futuro ".*coincida con el resto de la línea y ahora reemplazaremos todo en la línea de acuerdo con la siguiente expresión:

<a href="http://test.server.at/media/somefolder/\1target="_blank"><img src="http://test.server.at/media/somefolder/\1" alt="" width="350" height="" /></a>

donde \1es igual al nombre de la imagen como se mencionó anteriormente.

Espero que ahora quede claro cómo funciona.

información relacionada