0

我有一个看起来像这样的 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">

我尝试使用sedwith's/id="(*)"/id="$IdCOUNTER"/g'但这使得所有id属性都相同。我该如何解决这个问题?任何帮助表示赞赏,谢谢。

4

1 回答 1

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。

于 2013-11-08T02:16:53.423 回答