【问题标题】:Search a value in a file and change a number 3 lines after match在文件中搜索一个值并在匹配后更改数字 3 行
【发布时间】:2019-10-20 22:30:02
【问题描述】:

我们想在文件中找到一个特定的行,并在匹配后 3 行更改一个值。

例如我们正在搜索字符串“class_rproxy”

cat /var/git/control/Puppetfile | grep -A 3 class_rproxy

结果:

# class_rproxy
mod 'rproxy',
        :git => 'git@abcde.de:PE/rproxy.git',
        :tag => '1.3.59'

我们要将值“1.3.59”更改为“12.4.60”

我们怎样才能在不手动编辑的情况下只更改这个值。

谢谢

【问题讨论】:

  • 你有没有尝试过?
  • @oguzismail 我不知道该怎么做。在同一个文件中有一堆这样的行。
  • @oguzismail 非常感谢您。我尝试了很多事情都没有成功。
  • 欢迎。如果他们失败了也没关系,你应该把他们包括在你的问题中,这样人们至少会看到你已经尝试过自己解决你的问题,并且你更有可能得到一个体面的答案。
  • 您真的想要更改特定字符串1.3.59 还是真的只想更改与:tag => 关联的任何值?如果21.3.597 存在于该行,您是否希望将其更改为212.4.607?

标签: awk sed grep cat


【解决方案1】:

这是您的要求的一种可能解释:

$ awk '/class_rproxy/{c=4} c&&!(--c){sub(/[0-9.]+/,"12.4.60")} 1' file
foo
# class_rproxy
mod 'rproxy',
        :git => 'git@abcde.de:PE/rproxy.git',
        :tag => '12.4.60'
bar

请参阅https://stackoverflow.com/a/17914105/1745001 了解其工作原理。如果这不是您想要的替换,那么只需将 sub(/[0-9.]+/,"12.4.60") 更改为您想要的任何内容。

【讨论】:

  • 加一个用于将最相关的问题链接到此答案!我们应该更频繁地这样做。
  • 大部分都写完后更容易找到:)
【解决方案2】:

这是我的看法。

awk -v ver="12.4.60" '/^#/{n=0} /^# class_rproxy$/{n=1} n && $1==":tag" {sub(/[0-9]+\.[0-9.]+/, ver)} 1' puppetfile

以下是部分:

  • -v ver="12.4.60" - 将您的版本设置为 awk 可以使用的变量
  • /^#/{n=0} - 在任何评论中,将信号量设置为“false”
  • /^# class_rproxy$/{n=1} - 当我们看到正确的部分时,将信号量设置为“true”
  • n && $1==":tag" - 如果设置了信号量并且我们在正确的行...
  • {sub(/[0-9]+\.[0-9.]+/, ver)} 用变量替换我们找到的任何数字,
  • 1 - 然后打印。

这不是像 Ed 所做的那样倒数行数,而是创建一个小型状态机,该状态机使用信号量根据前面的注释触发对 :tag 值的更改。如果您想让该工具更通用一点,您甚至可以根据命令行上的变量 (-v) 进行部分检测。例如:

awk -v ver="12.4.60" -v sect="class_rproxy" '
  BEGIN {
    s="^# " sect "$"
  }
  /^#/ {n=0}
  $0 ~ s {n=1}
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2012-03-06
    • 2013-08-02
    • 2019-05-07
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多