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.