使用bash和awk编辑xml,awk don';不要替换文本
我有一个配置文件,有新的版本代码,比如SAD10A_BNA_1234_123456_110011,这个数字写入config.txt,这个数字必须放在这个xml文件的4个位置 这是我的剧本:使用bash和awk编辑xml,awk don';不要替换文本,xml,bash,shell,awk,sed,Xml,Bash,Shell,Awk,Sed,我有一个配置文件,有新的版本代码,比如SAD10A_BNA_1234_123456_110011,这个数字写入config.txt,这个数字必须放在这个xml文件的4个位置 这是我的剧本: #!/bin/bash NewNumber=`cat config.txt` echo $NewNumber #This number is: PLE31Z_BNE_1111_1121211_313131 awk '/"Parameter1"/ && !done++{sub(/Parameter1="
#!/bin/bash
NewNumber=`cat config.txt`
echo $NewNumber
#This number is: PLE31Z_BNE_1111_1121211_313131
awk '/"Parameter1"/ && !done++{sub(/Parameter1="[A-Z0-9]"/, "Parameter1=\"'$NewNumber'\"")}1' OldFileWithVersionNumeber.xml > temp.xml && mv -f temp.xml Newfile$NewNumber.xml
#I know, I must write 3 awk, but first one doesn't work for now
cat targettext.xml | grep Parameter1
带有旧参数的XML:
<OneSection Parameter1="SAD10A_BNA_1234_123456_110011" Parameter2="SAD10A_BNA_1234_123456_110011" Type="UWE-AD" date="05/01/2011">
AND LOT OF VERY SIMILAR LINES
AND TWO LINES WITH THE SAME NUMBER TO REPLACE
<xmlElement Name="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERF" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">
<xmlElement KeyName="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERFS" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">
还有很多非常相似的线条
和两条编号相同的线路进行更换
尝试使用awk
命令:
$ awk -v new="$NewNumber" '/Parameter1/ && NR==1{sub(/Parameter1="[[:alnum:]_]*/, "Parameter1=\""new)} 1' OldFileWithVersionNumeber.xml
<OneSection Parameter1="PLE31Z_BNE_1111_1121211_313131" Parameter2="SAD10A_BNA_1234_123456_110011" Type="UWE-AD" date="05/01/2011">
AND LOT OF VERY SIMILAR LINES
AND TWO LINES WITH THE SAME NUMBER TO REPLACE
<xmlElement Name="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERF" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">
<xmlElement KeyName="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERFS" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">
在我看来,这就像是
的目的!done++
将匹配限制在第一行。正确吗?最好避免使用旧的和过时的back tics,使用括号:NewNumber=$(cat config.txt)
。也不要将cat
与能够读取自身数据的程序一起使用:grep参数1 targettext.xml
不要在awk
表达式中使用变量。看这里:谢谢你的快速反应。不幸的是,你不工作:(我把你放在我的剧本里什么“不工作”意思是?如果你自己运行它,如答案所示,你会得到与我显示的相同的结果吗?这是你想要的结果吗?或者,如果问题只发生在awk
行是脚本的一部分时,具体症状是什么?如果我将这一行添加到脚本中,这个awk不会替换参数1,参数1是相同的,pa我也发现了参数2。我发现了错误,您输入了awk NR==1,但这是我的第二行:)并将数字更改为2,现在它工作了:)我如何在这个xml中更改参数2?@Dzions非常好。我添加了一个新版本,如果这两个参数出现在文件的第二行,它将更改这两个参数。
$ awk --posix -v new="$NewNumber" '/Parameter1/ && NR==2{sub(/Parameter1="[[:alnum:]_]*/, "Parameter1=\""new); sub(/Parameter2="[[:alnum:]_]*/, "Parameter2=\""new)} 1' OldFileWithVersionNumeber.xml
<OneSection Parameter1="PLE31Z_BNE_1111_1121211_313131" Parameter2="PLE31Z_BNE_1111_1121211_313131" Type="UWE-AD" date="05/01/2011">
AND LOT OF VERY SIMILAR LINES
AND TWO LINES WITH THE SAME NUMBER TO REPLACE
<xmlElement Name="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERF" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">
<xmlElement KeyName="" name="NameGB" version="_SAD10A_BNA_1234_123456_110011.xml" Unit="ERFS" Blocks="1" params1="" params2="" Path1="/rom/" path2="" comp="" encrypted="">