GNU/Linux >> Linux Esercitazione >  >> Linux

Aggiunta di suffissi numerici ai nomi dei tag per distinguere gli elementi XML?

Ho un file XML con più elementi figlio che hanno lo stesso nome di tag, ad es. <Name>Luigi</Name> , <Name>Mario</Name> , <Name>Peach</Name> . Ecco un mock-up di come appare il mio file di input:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

Quando lancio questo file in Excel per l'analisi, viene creato un nuovo record per ogni Name elemento. Questo è fantastico dal punto di vista della leggibilità, ma rende difficile discernere se ho molti dati duplicati al di fuori dei campi del nome.

Quello che voglio fare è rinominare i tag in Name1 , Name2 , Name3 in modo che appaiano tutti sulla stessa riga quando li importo in Excel. In questo modo sarò in grado di trovare record per me inutili o che contengono duplicati, senza dover guardare costantemente i dati grezzi.

In altre parole, voglio uno script o un comando che produca il seguente output:

<!-- names.xml -->
<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

È possibile farlo con un sed comando o altro script Unix?

Risposta accettata:

Dal momento che hai chiesto espressamente sed , ecco un sed /bash script che dovrebbe fare quello che vuoi, a condizione che ogni <Name> l'elemento viene aperto e chiuso sulla stessa riga:

(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

L'ho testato con questo file di input:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

E ha prodotto il seguente output:

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

Detto questo, questo sembra un buon candidato per un linguaggio con una libreria di analisi XML. Ecco uno script Python che fa quello che vuoi:

#!/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])

Esegui in questo modo:

python add_suffix.py names.xml new_names.xml

Linux
  1. Il reindirizzamento a un nome di file Globbed non riesce?

  2. Logname:Nessun nome di accesso?

  3. Elementi separati delle parole Camelcase?

  4. Aggiunta di un IP a un server Windows

  5. Cerca attributi XML PowerShell XPath

Come installare Jenkins su Kubernetes

Aggiunta di un emulatore di terminale aggiuntivo in Linux

Array negli script di shell

Cambia il nome utente su Linux

Rimuove un collegamento simbolico a una directory

Testare nginx senza nome di dominio