XML의 대량 대체

XML의 대량 대체

좋습니다. 이 xml 파일이 있습니다. 각 키 값을 다른 파일(txt)의 값으로 바꿔야 합니다. 두 파일 모두 정렬되어 라인 20이 xml 안에 있습니다.

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

두 번째 파일에서 라인 20은 다음과 같습니다.

testvalue2

testvalue1에서 testvalue2로 값을 변경하는 방법을 찾고 있습니다.

답변1

이것은 작동합니다.
새 값 파일을 로드한 다음 행 번호를 키로 사용하여 이전 값을 새 값으로 대체하여 xml 파일을 처리합니다.

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

시험:

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

답변2

빠른 bash 스크립트:

#!/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    

이는 테스트되지 않았지만 필요에 따라 작동할 것입니다.

관련 정보