Question

J'ai un fichier XML qui ressemble à ceci:

<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>

chaque id Attribut que je souhaite remplacer par mon propre attribut. Je veux que mon fichier final ressemble à ceci:

<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">

Cependant, le id L'attribut est référencé dans d'autres endroits dans le fichier:

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

Cette ligne doit être mise à jour pour:

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

J'ai essayé d'utiliser sed avec 's/id="(*)"/id="$IdCOUNTER"/g' Mais cela fait tout id attribue la même chose. Comment puis-je résoudre ça? Toute aide est appréciée, merci.

Était-ce utile?

La solution

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

En supposant que votre fichier XML soit bien formaté (c'est-à-dire que chaque balise est sur une seule ligne), vous pouvez vous en sortir avec SED et BASH. Sinon, vous aurez besoin d'une langue avec un analyseur XML. La même approche fonctionnera, mais les détails varieront.

Faites une carte des ID pour les remplacements. Ensuite, chaque fois que vous rencontrez un identifiant que vous avez vu auparavant, vous le regardez et le remplacez.

La sed ligne au-dessus des cartes chaque ID à partir d'un <species> Tag sur un ID numéroté (les bombardements permettent de diviser la ligne sur plusieurs lignes pour la lisibilité).

Le fichier est copié pour empêcher la modification de l'original.

Comme chaque ligne est lue à partir du fichier de carte ID, toutes les occurrences de l'ID d'origine sont remplacées par le nouvel ID numéroté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top