替换文件中的唯一标识符

时间:2013-11-07 21:20:29

标签: file replace sed uniqueidentifier

我有一个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属性相同。我怎么解决这个问题?感谢任何帮助,谢谢。

1 个答案:

答案 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。