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

发布于 2024-07-18 07:45:17 字数 933 浏览 7 评论 0原文

我有一个小的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌路终见情 2024-07-25 07:45:17
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]
    }
}
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]
    }
}
海之角 2024-07-25 07:45:17

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

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

My AWK is rusty, so I won't provide actual code.

  • Initialize an array with the regular expressions and values.
  • For each line, iterate the array and do appropriate substitutions. Clean out used entries.
  • At end, iterate the array and append lines for remaining entries.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文