Вопрос

У меня есть 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 атрибуты те же.Как я могу решить эту проблему?Любая помощь приветствуется, спасибо.

Это было полезно?

Решение

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> присваивайте тегу пронумерованный идентификатор (обратная косая черта позволяет разделить строку на несколько строк для удобства чтения).

Файл копируется, чтобы предотвратить изменение оригинала.

По мере считывания каждой строки из файла карты идентификаторов все вхождения исходного идентификатора заменяются новым пронумерованным идентификатором.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top