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

时间:2015-02-02 07:46:53

标签: 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="[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="">

1 个答案:

答案 0 :(得分:1)

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

如何运作

  • -v new="$NewNumber"

    这定义了一个名为awk的{​​{1}}变量,其中包含new的值。

  • NewNumber

    这选择(1)包含/Parameter1/ && NR==1的行,(2)是文件的第一行(Parameter1)。

  • NR==1

    这取代了。请注意正则表达式的三个更改:

    • 使用sub(/Parameter1="[[:alnum:]_]*/, "Parameter1=\""new)代替[:alnum:],正则表达式现在可以安全使用Unicode字体。

    • 下划线字符已添加到允许的字符中。

    • [A-Z0-9]之后添加*,以便可以匹配零个或多个字符。以前,它只匹配一个。

    另请注意,替换文本现在使用变量[[:alnum:]_]。这可以避免引用shell的问题,如果new包含NewNumber - 活动字符,也会更安全。

同时更改awkparameter1

如果输入文件的第二行出现以下代码,则会更改parameter2parameter1

parameter2