我有一个以下格式的属性文件(说文件的名称是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
任何人都可以在编写脚本时告诉我我做错了什么。
由于
答案 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