好的,我有这个 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
请注意,这尚未经过测试,但它应该可以满足您的需求。