Sustituya el texto con sed y mantenga parte del texto original

20

Estoy tratando de convertir

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

a:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

Supongo que la mejor herramienta para el trabajo sería sed, sin embargo, no puedo encontrar la manera de mantener partes del texto original en la parte de reemplazo.

Si lo hago:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

El resultado es:

<column name="\1">\2</column>
<column name="\1">\2</column>

O haciendo algo similar desde adentro vi, genera:

<column name=""></column>
<column name=""></column>

¿Cómo puedo hacer para que \1y \2son sustituidos a sus valores originales?

Micro
fuente

Respuestas:

21

Puede usar grupos, por ejemplo:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

Probablemente la parte más confusa sobre las ER es que hay varios sabores sintácticos.

Por ejemplo, sed y vim usan expresiones regulares básicas donde tienes que citar ()para obtener su meta-significado.

Con expresiones regulares extendidas (por ejemplo, awk, egrep y menos) debe citar ()para obtener el significado literal. Existen diferencias similares para otros metacaracteres.

La razón detrás de la ()semántica de BRE es que cuando la mayor parte de su entrada es C-Code, es más práctico tener que citar paréntesis para el meta-uso.

maxschlepzig
fuente
Este fue en realidad el primero que he intentado, pero no escapó a la (y )caracteres. Pregunta estúpida, pero ¿por qué es eso necesario?
Mike
1
@ Mike, buena pregunta: se actualizó la respuesta.
maxschlepzig