Tengo un archivo XML con varios elementos secundarios que tienen el mismo nombre de etiqueta, ej. <Name>Luigi</Name>
, <Name>Mario</Name>
, <Name>Peach</Name>
. Aquí hay una maqueta de cómo se ve mi archivo de entrada:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Cuando lanzo este archivo a Excel para su análisis, crea un nuevo registro para cada Name
elemento. Esto es increíble desde la perspectiva de la legibilidad, pero hace que sea difícil discernir si tengo muchos datos duplicados fuera de los campos de nombre.
Lo que quiero hacer es cambiar el nombre de las etiquetas a Name1
, Name2
, Name3
para que todos aparezcan en la misma fila cuando los importe a Excel. De esa forma, podré encontrar registros que no me sirven o que contienen duplicados, sin tener que mirar constantemente los datos sin procesar.
En otras palabras, quiero un script o comando que produzca el siguiente resultado:
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
¿Es posible hacer esto con un sed? comando u otro script de Unix?
Respuesta aceptada:
Dado que solicitó específicamente sed
, aquí hay un sed
/bash
secuencia de comandos que debe hacer lo que desea, siempre que cada <Name>
el elemento se abre y se cierra en la misma línea:
(IFS='';
n=0;
while read line; do
if echo "${line}" | grep -Pq "<Name>\w+</Name>"; then
((n++));
echo "${line}" | sed "s/<Name>\(\w\+\)<\/Name>/<Name${n}>\1<\/Name${n}>/";
else
echo "${line}";
fi;
done) < names.xml
Lo probé con este archivo de entrada:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Y produjo el siguiente resultado:
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Dicho esto, parece un buen candidato para un lenguaje con una biblioteca de análisis XML. Aquí hay un script de Python que hace lo que quieres:
#!/usr/bin/env python2
# -*- encoding: ascii -*-
# add_suffix.py
import sys
import xml.etree.ElementTree
# Load the data
tree = xml.etree.ElementTree.parse(sys.argv[1])
root = tree.getroot()
# Update the XML tree
suffix = 0
for name in root.iter("Name"):
suffix += 1
name.tag += str(suffix)
# Write out the updated data
tree.write(sys.argv[2])
Ejecútalo así:
python add_suffix.py names.xml new_names.xml