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.