使用awk更改文件中的值

时间:2012-08-08 13:23:12

标签: bash ksh

我有一个以下格式的属性文件(说文件的名称是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

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

由于

2 个答案:

答案 0 :(得分:2)

awk计划(awk 'BEGIN...')周围的单引号会阻止$property_name的扩展。将您的awk调用更改为:

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

请注意,外部单引号已替换为双引号,所有原始双引号均已使用\进行转义。

答案 1 :(得分: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
相关问题