awk:根据行的存在修改或追加行
-
08-07-2019 - |
题
我有一个小的 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 知识不是那么丰富,上面只是 感觉 错误 - 我怎样才能简化这个?
附:如果可能的话,我想继续使用 awk。请不要只是建议使用 Perl/Python/任何会更容易的东西。:-)
解决方案
BEGIN {
defaults["some.value"] = "SOME VALUE"
defaults["other.value"] = "OTHER VALUE"
}
{
for (key in defaults) {
pattern = key
gsub(/\./, "\\.", pattern)
if (match(<*>, "^" pattern "=.*")) {
gsub(/=.*/, "=" defaults[key])
delete defaults[key]
}
}
print <*>
}
END {
for (key in defaults) {
print key "=" defaults[key]
}
}
其他提示
我的 AWK 已经生锈了,所以我不会提供实际的代码。
- 使用正则表达式和值初始化数组。
- 对于每一行,迭代数组并进行适当的替换。清理使用过的条目。
- 最后,迭代数组并为剩余条目追加行。
不隶属于 StackOverflow