【问题标题】:awk: Either modify or append a line, based on its existenceawk:根据行的存在修改或追加一行
【发布时间】:2010-10-24 12:37:06
【问题描述】:

我有一个小的 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/whatever 会容易得多。 :-)

【问题讨论】:

  • 您发布的内容似乎是 awk,而不是 sed。
  • 我全神贯注地写这篇文章,以至于我什至没有注意到。已更正。
  • Perl/Python/Whatever 会容易得多 ;-)
  • @Sean Bright:我只是在数秒,直到有人发表评论。 :-D
  • 讽刺的是,肖恩的回答比 perl/python 等价物更容易

标签: regex deployment awk configuration-files


【解决方案1】:
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]
    }
}

【讨论】:

  • 解决方案。默认键的顺序取决于哈希,因此最终未使用的键不会以与声明相同的顺序显示,但这是一个小问题。
  • @Sean Bright:漂亮,谢谢。额外的问题:我将如何正则表达式转义 for 循环中的键?它现在可以工作,但这些点实际上只是偶然匹配。
  • 啊,我明白了。很公平。我希望有一个神奇的“引用正则表达式”功能,但这会做。 :)
  • 啊。可能有一个,但我不知道 awk,很遗憾。
  • 在我阅读了更多文档之后——在 awk 中对字符串进行正则表达式转义的更通用方法如下:pattern = gensub(/([.(){}+ *?|[]\])/, "\\\\\\1", "g", 键)
【解决方案2】:

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

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

【讨论】:

  • 基本上,这正是@Sean Bright 实现的。 +1
猜你喜欢
  • 2019-09-04
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多