Frage

Ich habe eine XML -Datei, die so aussieht:

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

jeder id Attribut, das ich durch mein eigenes Attribut ersetzen möchte. Ich möchte, dass meine Enddatei so aussieht:

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

Jedoch das id Das Attribut wird an anderen Stellen in der Datei verwiesen:

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

Diese Zeile sollte aktualisiert werden auf:

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

Ich habe versucht zu benutzen sed mit 's/id="(*)"/id="$IdCOUNTER"/g' Aber das macht alle id die gleichen Attribute. Wie kann ich das lösen? Jede Hilfe wird geschätzt, danke.

War es hilfreich?

Lösung

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

Unter der Annahme, dass Ihre XML -Datei gut formatiert ist (dh jedes Tag ist alles in einer Zeile), können Sie mit SED und Bash davonkommen. Andernfalls benötigen Sie eine Sprache mit einem XML -Parser. Der gleiche Ansatz wird funktionieren, aber die Details variieren.

Machen Sie eine Karte von IDs zum Ersatz. Jedes Mal, wenn Sie auf eine ID begegnen, die Sie zuvor gesehen haben, schauen Sie sie nach und ersetzen sie.

Das sed Zeile über Karten jeder ID von a <species> Tag zu einer nummerierten ID (die Backslashes ermöglichen es, dass die Zeile zur Lesbarkeit über mehrere Zeilen aufgeteilt wird).

Die Datei wird kopiert, um zu verhindern, dass das Original geändert wird.

Da jede Zeile aus der ID -Karte gelesen wird, werden alle Vorkommen der ursprünglichen ID durch die neue, nummerierte ID ersetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top