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    

请注意,这尚未经过测试,但它应该可以满足您的需求。

相关内容