Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash和awk编辑xml,awk don';不要替换文本_Xml_Bash_Shell_Awk_Sed - Fatal编程技术网

使用bash和awk编辑xml,awk don';不要替换文本

使用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="

我有一个配置文件,有新的版本代码,比如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="[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="">