좋습니다. 이 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
이는 테스트되지 않았지만 필요에 따라 작동할 것입니다.