1

我有一个以下格式的属性文件(说文件名是 oldProperties.properties)

group1.value1=Hello
group1.value2=World
group1.value3=BlaBla
group1.vlaue4=blabla2

现在我想开发一个脚本来更改属性文件中的特定值并创建一个新文件。该脚本应将属性的 propertyName 和 newValue 作为命令行参数。

changePropertyValue.ksh group1.value3 GoodBye

结果文件(比如 newProperties.properties)应该如下所示

    group1.value1=Hello
    group1.value2=World
    group1.value3=GoodBye
    group1.vlaue4=blabla2

为此,我在 changePropertyValue.ksh 中编写了这些代码行

property_name=$1
new_value=$2

old_properties=oldProperties.properties
new_properties=newProperties.properties

echo "" > $new_properties

cat $old_properties |  awk 'BEGIN{ FS="=";OFS="=" } {if($1=="$property_name") $2="$new_value"; print $0;}' >> $new_properties

我正在启动这个

changePropertyValue.ksh group1.value3 GoodBye 

现在,当我对 newProperties 文件执行 grep 操作时,我得到了旧值,即

grep group1.value3 newProperties.properties
output 
group1.value3=BlaBla

同时,如果我直接在命令行上启动 awk 命令,它工作正常,即如果我启动它

cat oldProperties.properties |  awk 'BEGIN{ FS="=";OFS="=" } {if($1=="group1.value3") $2="GoodBye"; print $0;}' | grep group1.value3

output is :-
group1.value3=GoodBye

任何人都可以告诉我在编写脚本时我做错了什么。

谢谢

4

2 回答 2

2

awkprogram ( )周围的单引号awk 'BEGIN...'可防止$property_name. awk将您的调用更改为:

cat $old_properties |  awk "BEGIN{ FS=\"=\";OFS=\"=\" } {if(\$1==\"$property_name\") \$2=\"$new_value\"; print \$0;}" >> $new_properties

注意外面的单引号已经被双引号代替了,所有原来的双引号都被转义了\

于 2012-08-08T13:40:38.960 回答
2

另一种选择是将 的值$property_name作为变量传递给awk

awk 'BEGIN{ FS="=";OFS="=" } {if($1==pname) $2=newval; print $0;}' pname="$property_name" newval="$new_value" $old_properties >> $new_properties
于 2012-08-08T14:12:37.230 回答