代码之家  ›  专栏  ›  技术社区  ›  Tomalak

awk:根据行的存在,修改或附加行

  •  1
  • Tomalak  · 技术社区  · 15 年前

    我有一个小的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/任何东西都要容易得多。-)

    2 回复  |  直到 15 年前
        1
  •  4
  •   Sean Bright Sean Stinehour    15 年前
    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]
        }
    }
    
        2
  •  2
  •   Darron    15 年前

    我的锥子生锈了,所以我不提供实际的代码。

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