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
Supondo que seu arquivo XML seja bem formatado (ou seja, cada tag está em uma linha), você pode se safar com sed e bash. Caso contrário, você precisará de um idioma com um analisador XML. A mesma abordagem funcionará, mas os detalhes variam.
Faça um mapa de IDs para substituições. Em seguida, cada vez que você encontra um ID que você viu antes, você procurá -lo e substitui -o.
o sed
linha acima de mapas cada id de um <species>
Tag em um ID numerado (as barras -barras permitem que a linha seja dividida em várias linhas para obter legibilidade).
O arquivo é copiado para evitar a modificação do original.
Como cada linha é lida no arquivo de mapa de identificação, todas as ocorrências do ID original são substituídas pelo novo ID numerado.