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