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ファイルがうまくフォーマットされていると仮定すると(つまり、各タグはすべて1行にあります)、SEDとBashで逃げることができます。それ以外の場合は、XMLパーサーを備えた言語が必要です。同じアプローチが機能しますが、詳細は異なります。
交換用のIDのマップを作成します。次に、以前に見たIDに遭遇するたびに、調べて交換します。
sed
上記の行は、aから各IDをマッピングします <species>
番号付きIDにタグを付けます(バックスラッシュにより、読みやすくするためにいくつかの行にラインを分割できます)。
ファイルは、オリジナルの変更を防ぐためにコピーされます。
各行がIDマップファイルから読み取られるため、元のIDのすべての発生は、新しい番号付きIDに置き換えられます。