我有一个小的awk脚本,可以对一个Java .properties
文件进行一些就地文件修改,以便给你一个想法。这是影响大量用户的部署脚本的一部分。
我希望能够设置默认值,将文件的其余部分保留在用户的首选项中。这意味着如果缺少配置行,则附加配置行,如果存在,则修改配置行,将其他所有内容保留原样。
目前我使用的是这样的东西:
# initialize
BEGIN {
some_value_set = 0
other_value_set = 0
some_value_default = "some.value=SOME VALUE"
other_value_default = "other.value=OTHER VALUE"
}
# modify existing lines
{
if (/^some\.value=.*/)
{
gsub(/.*/, some_value_default)
some_value_set = 1
}
else if (/^other\.value=.*/)
{
gsub(/.*/, other_value_default)
other_value_set = 1
}
print $0
}
# append missing lines
END {
if (some_value_set == 0) print some_value_default
if (other_value_set == 0) print other_value_default
}
特别是当我想要控制的行数变大时,这变得越来越麻烦。我的awk知识并不是那么好,以上只是感觉错误 - 我怎样才能简化这个?
P.S。:如果可能的话,我想和awk呆在一起。请不要只是建议使用Perl / Python /任何更容易的东西。 : - )
答案 0 :(得分:4)
BEGIN {
defaults["some.value"] = "SOME VALUE"
defaults["other.value"] = "OTHER VALUE"
}
{
for (key in defaults) {
pattern = key
gsub(/\./, "\\.", pattern)
if (match($0, "^" pattern "=.*")) {
gsub(/=.*/, "=" defaults[key])
delete defaults[key]
}
}
print $0
}
END {
for (key in defaults) {
print key "=" defaults[key]
}
}
答案 1 :(得分:2)
我的AWK生锈了,所以我不会提供实际代码。