Large replace em XML

1

Ok, eu tenho esse arquivo xml. Eu preciso substituir cada valor de chave com um valor de outro arquivo (txt). Ambos os arquivos são classificados de acordo com a linha 20, ou seja, dentro do xml

<word key="ACTIVE" group="Service application" value="testvalue1"/>

Dentro do meu segundo arquivo, na linha 20 será

testvalue2

Estou procurando algo que altere o valor de testvalue1 para testvalue2

    
por James Berrisford 20.02.2017 / 11:20

2 respostas

2

Isso deve funcionar.
Carregamos o novo arquivo de valores e, em seguida, processamos o arquivo xml substituindo o valor antigo pelo novo valor usando o número da linha como chave.

awk 'FNR==NR{a[FNR]=$0;next}{$NF=gensub(/value=".*"\/>/,"value=\""a[FNR]"\"\/>","g",$NF);print}' file2 file
#OR working with regex groups:
awk 'FNR==NR{a[FNR]=$0;next}{$NF=gensub(/(value=")(.*)(".+)/,"\1"a[FNR]"\3","g",$NF);print}' file2 file

Teste:

$ cat file
<word key="ACTIVE" group="Service application" value="testvalue1"/>                                                                                                             
<word key="ACTIVE" group="Service application" value="testvalue2"/>                                                                                                             
<word key="ACTIVE" group="Service application" value="testvalue3"/>                                                                                                             
<word key="ACTIVE" group="Service application" value="testvalue4"/>
<word key="ACTIVE" group="Service application" value=""/>

$ cat file2
newvalue1
newvalue2
newvalue3
newvalue4                                                                                                                          
newvalue5

$ awk 'FNR==NR{a[FNR]=$0;next}{$NF=gensub(/value=".*"\/>/,"value=\""a[FNR]"\"\/>","g",$NF);print}' file2 file
<word key="ACTIVE" group="Service application" value="newvalue1"/>
<word key="ACTIVE" group="Service application" value="newvalue2"/>
<word key="ACTIVE" group="Service application" value="newvalue3"/>
<word key="ACTIVE" group="Service application" value="newvalue4"/>
<word key="ACTIVE" group="Service application" value="newvalue5"/>
    
por 20.02.2017 / 12:17
0

Um script rápido:

#!/bin/bash
#set IFS to new line
IFS=$'\n';
line_number=0
for line in $(cat file1.xml); do        
    ((line_number++))
#get the value you want to replace
    value1=$(echo $line | grep -o -P 'value.{0,1000}' |  cut -d '"' -f 2)
#get the value you are replacing it with
    value2=$(sed "${line_number}q;d" file2.txt)
#run the replace using sed
    sed -i 's/'"${value1}"'/'"${value2}"'/g' file1.xml
done    

Observe que isso não foi testado, mas deve funcionar de acordo com suas necessidades.

    
por 20.02.2017 / 12:22