GNU/Linux >> Tutoriales Linux >  >> Linux

¿Agregar sufijos numéricos a los nombres de las etiquetas para distinguir los elementos Xml?

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

Linux
  1. Buscar atributos XML PowerShell XPath

  2. Eliminar un enlace simbólico a un directorio

  3. ¿Cómo nombrar un hilo en Linux?

  4. Agregar sección al archivo ELF

  5. ¿Cómo identificar el puerto de un proceso?

Cómo instalar Jenkins en Kubernetes

Agregar un emulador de terminal adicional en Linux

Agregar un nuevo servicio a Linux systemd

¿La redirección a un nombre de archivo global falla?

Matrices en scripts de Shell

Eliminar y agregar permisos usando notación numérica en la misma línea