我有一个xml文件,如下所示:
<species compartment="compartment" id="alpha_dash_D_dash_glucose_dash_6P" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="six_dash_Phospho_dash_D_dash_gluconate" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="beta_dash_D_dash_Fructose_dash_6P2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="beta_dash_D_dash_Glucose" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
我希望用自己的属性替换每个id
属性。我希望我的结束文件看起来像这样:
<species compartment="compartment" id="id1" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="id2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="id3" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
</species>
<species compartment="compartment" id="id4" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
但是id
属性在文件的其他位置引用:
<speciesReference constant="true" stoichiometry="1" species="alpha_dash_D_dash_glucose_dash_6P">
此行应更新为:
<speciesReference constant="true" stoichiometry="1" species="id1">
我尝试将sed
与's/id="(*)"/id="$IdCOUNTER"/g'
一起使用,但这会使所有id
属性相同。我怎么解决这个问题?感谢任何帮助,谢谢。
答案 0 :(得分:1)
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解析器的语言。同样的方法也可行,但细节会有所不同。
制作要替换的ID地图。然后,每次遇到你以前见过的id时,你都要查找并替换它。
上面的sed
行将每个id从<species>
标记映射到编号的id(反斜杠允许将这些行拆分为多行以便于阅读)。
复制文件以防止修改原始文件。
当从id映射文件中读取每一行时,所有出现的原始id都将替换为新的编号id。