Domanda

Ho un file XML che assomiglia a questo:

<species compartment="compartment" id="alpha_dash_D_dash_glucose_dash_6P" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="six_dash_Phospho_dash_D_dash_gluconate" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="beta_dash_D_dash_Fructose_dash_6P2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="beta_dash_D_dash_Glucose" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>

a testa id attributo che voglio sostituire con il mio attributo. Voglio che il mio file finale sembri così:

<species compartment="compartment" id="id1" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id3" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id4" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">

In ogni caso, il id L'attributo è citato in altri luoghi nel file:

 <speciesReference constant="true" stoichiometry="1" species="alpha_dash_D_dash_glucose_dash_6P">

Questa riga dovrebbe essere aggiornata a:

 <speciesReference constant="true" stoichiometry="1" species="id1">

Ho provato a usare sed insieme a 's/id="(*)"/id="$IdCOUNTER"/g' Ma questo rende tutto id attributi lo stesso. Come posso risolvere questo? Ogni aiuto è apprezzato, grazie.

È stato utile?

Soluzione

sed -n 's/\s*<species [^>]* id="\([^"]*\).*/\1/p' species.xml |\
  cat -n |\
  sed 's/\s*\([0-9]\+\)\s*/id\1 /' > ids.txt

cp species.xml my_species.xml

while read a b
do
  sed -i 's/"'"$b"'"/"'$a'"/g' my_species.xml
done < ids.txt

Supponendo che il tuo file XML sia ben formattato (cioè ogni tag è tutto su una riga), puoi cavartela con SED e Bash. Altrimenti, avrai bisogno di una lingua con un parser XML. Lo stesso approccio funzionerà, ma i dettagli varieranno.

Crea una mappa di ID per le sostituzioni. Quindi, ogni volta che incontri un ID che hai visto prima, lo guardi e lo sostituisci.

Il sed riga sopra le mappe ogni ID da a <species> Tag in un ID numerato (le backsheshes consentono di dividere la linea su più righe per la leggibilità).

Il file viene copiato per impedire la modifica dell'originale.

Poiché ogni riga viene letta dal file della mappa ID, tutte le occorrenze dell'ID originale vengono sostituite con il nuovo ID numerato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top