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
Suponiendo que su archivo XML esté bien formateado (es decir, cada etiqueta está en una línea), puede salirse con la suya y Bash. De lo contrario, necesitará un idioma con un analizador XML. El mismo enfoque funcionará, pero los detalles variarán.
Haga un mapa de IDS para reemplazar. Luego, cada vez que te encuentras con una identificación que has visto antes, la busca y la reemplace.
los sed
línea arriba mapea cada identificación desde un <species>
Etiqueta a una ID numerada (las barras de retroceso permiten que la línea se divida sobre varias líneas para legibilidad).
El archivo se copia para evitar modificar el original.
Como cada línea se lee desde el archivo de mapa de ID, todos los ocurrencias de la ID original se reemplazan con la nueva ID numerada.