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
Предполагая, что ваш XML-файл правильно отформатирован (т. Е. каждый тег находится в одной строке), вы можете обойтись без sed и bash.В противном случае вам понадобится язык с анализатором XML.Тот же подход будет работать, но детали будут отличаться.
Составьте карту идентификаторов для замен.Затем, каждый раз, когда вы сталкиваетесь с идентификатором, который вы видели раньше, вы просматриваете его и заменяете.
Тот Самый sed
строка выше отображает каждый идентификатор из <species>
присваивайте тегу пронумерованный идентификатор (обратная косая черта позволяет разделить строку на несколько строк для удобства чтения).
Файл копируется, чтобы предотвратить изменение оригинала.
По мере считывания каждой строки из файла карты идентификаторов все вхождения исходного идентификатора заменяются новым пронумерованным идентификатором.