2013-11-07 5 views
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"> 

Я пробовал использовать sed с 's/id="(*)"/id="$IdCOUNTER"/g', но это делает все id атрибутами же. Как я могу это решить? Любая помощь приветствуется, спасибо.

ответ

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 красиво отформатирована (то есть, каждый тег в одной строке), вы можете уйти с СЕПГ и Баш. В противном случае вам понадобится язык с парсером XML. Тот же подход будет работать, но детали будут отличаться.

Составьте карту идентификаторов для замены. Затем, каждый раз, когда вы сталкиваетесь с идентификатором, который вы видели раньше, вы просматриваете его и заменяете.

Строка sed отображает каждый идентификатор с метки <species> на пронумерованный идентификатор (обратные косые черты позволяют разделить линию на несколько строк для удобства чтения).

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

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

+0

thanks @traybold, я собирался использовать XML-парсер и изменить их вручную. – mihajlv

Смежные вопросы