Pregunta

Tengo un archivo XML que se ve así:

<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 que quiero reemplazar con mi propio atributo. Quiero que mi archivo final se vea así:

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

Sin embargo, el id El atributo se hace referencia en otros lugares en el archivo:

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

Esta línea debe actualizarse a:

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

Intenté usar sed con 's/id="(*)"/id="$IdCOUNTER"/g' Pero esto hace todo id atribuye lo mismo. ¿Como puedo resolver esto? Cualquier ayuda se agradece, gracias.

¿Fue útil?

Solución

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

Suponiendo que su archivo XML esté bien formateado (es decir, cada etiqueta está en una línea), puede salirse con la suya y Bash. De lo contrario, necesitará un idioma con un analizador XML. El mismo enfoque funcionará, pero los detalles variarán.

Haga un mapa de IDS para reemplazar. Luego, cada vez que te encuentras con una identificación que has visto antes, la busca y la reemplace.

los sed línea arriba mapea cada identificación desde un <species> Etiqueta a una ID numerada (las barras de retroceso permiten que la línea se divida sobre varias líneas para legibilidad).

El archivo se copia para evitar modificar el original.

Como cada línea se lee desde el archivo de mapa de ID, todos los ocurrencias de la ID original se reemplazan con la nueva ID numerada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top