Pergunta

Eu tenho um arquivo XML que se parece com o seguinte:

<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>

cada id Atributo, quero substituir por meu próprio atributo. Eu quero que meu arquivo final pareça assim:

<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">

No entanto, o id O atributo é referenciado em outros lugares do arquivo:

 <speciesReference constant="true" stoichiometry="1" species="alpha_dash_D_dash_glucose_dash_6P">

Esta linha deve ser atualizada para:

 <speciesReference constant="true" stoichiometry="1" species="id1">

Eu tentei usar sed com 's/id="(*)"/id="$IdCOUNTER"/g' Mas isso faz tudo id atributos os mesmos. Como posso resolver isso? Qualquer ajuda é apreciada, obrigado.

Foi útil?

Solução

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

Supondo que seu arquivo XML seja bem formatado (ou seja, cada tag está em uma linha), você pode se safar com sed e bash. Caso contrário, você precisará de um idioma com um analisador XML. A mesma abordagem funcionará, mas os detalhes variam.

Faça um mapa de IDs para substituições. Em seguida, cada vez que você encontra um ID que você viu antes, você procurá -lo e substitui -o.

o sed linha acima de mapas cada id de um <species> Tag em um ID numerado (as barras -barras permitem que a linha seja dividida em várias linhas para obter legibilidade).

O arquivo é copiado para evitar a modificação do original.

Como cada linha é lida no arquivo de mapa de identificação, todas as ocorrências do ID original são substituídas pelo novo ID numerado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top