awk:根据行的存在修改或追加行
我有一个小的 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 知识并不是那么丰富,上面的内容感觉是错误的 - 我怎样才能简化它?
PS:如果可能的话,我想继续使用awk。 请不要仅仅建议使用 Perl/Python/任何会更容易的语言。 :-)
I have a small awk script that does some in-place file modifications (to a Java .properties
file, to give you an idea). This is part of a deployment script affecting a bunch of users.
I want to be able to set defaults, leaving the rest of the file at the user's preferences. This means appending a configuration line if it is missing, modifying it if it is there, leaving everything else as it is.
Currently I use something like this:
# 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
}
Especially when the number of lines I want to control gets larger, this is increasingly cumbersome. My awk knowledge is not all that great, and the above just feels wrong - how can I streamline this?
P.S.: If possible, I'd like to stay with awk. Please don't just recommend that using Perl/Python/whatever would be much easier. :-)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的 AWK 已经生锈了,所以我不会提供实际的代码。
My AWK is rusty, so I won't provide actual code.