awk:根据其存在来修改或附加一行

时间:2009-05-07 14:58:59

标签: regex deployment awk configuration-files

我有一个小的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 /任何更容易的东西。 : - )

2 个答案:

答案 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生锈了,所以我不会提供实际代码。

  • 使用正则表达式和值初始化数组。
  • 对于每一行,迭代数组并进行适当的替换。清理用过的条目。
  • 最后,迭代数组并为剩余的条目附加行。