【问题标题】:sed,awk.grep - add a line to the end of a configuration section if the line doesn't already existsed,awk.grep - 如果该行不存在,则在配置部分的末尾添加一行
【发布时间】:2013-04-12 16:54:54
【问题描述】:

我想使用 sed/awk 编辑文件。该文件由几个配置部分组成,如下所示:

SECTION 1 BEGIN
some stuff
SECTION END

SECTION 2 BEGIN
some stuff
some more stuff
important line
SECTION END

如果SECTION 2 尚不存在,我想将其添加到important line 的末尾,最好作为命令一行。我一直在查看 fgrep/sed 组合 in this question,,但我不太明白如何根据需要调整它。

注意:章节中可能有空行。

非常感谢。

【问题讨论】:

    标签: linux sed awk grep


    【解决方案1】:

    使用awk:

    awk '
      $0 == "SECTION 2 BEGIN" { inSec2 = 1 } 
      inSec2 && $0 == "important line" { hasImportant = 1 } 
      inSec2 && $0 == "SECTION END" { 
        if (!hasImportant) { print "important line" } 
        inSec2 = 0
      }
      1'
    

    【讨论】:

    • 谢谢迈克尔,这很好用。我真的需要学习 awk,它看起来很糟糕!
    • 很好的解决方案。只是小cmets。我认为可以使用更短的/^...$/ 而不是$0 == "..."。而不是在第二个条件中设置hasImportant,inSec2 变量可以被清除。所以在第三种情况下,if 语句变得毫无用处。只需print“重要行”。
    • “重要行”字符串也可以定义一次为awk -vimplin="important line"(在BEGIN块中定义更长)。然后implin 可以稍后使用。
    • @TrueY 你提出了足够多的更改,我建议你发布另一个解决方案来展示另一种方法。
    • @simon 对不起,我真的不知道在 tcsh 中编写脚本的细节。如果您无法弄清楚,只需将我在答案中给出的内容保存在一个文件中,将#! /bin/sh 粘贴在顶部,使用chmod(或任何等效的tcsh)使其可执行,然后通过管道传输您的通过它发短信。
    【解决方案2】:

    基于迈克尔的解决方案,有一个单行:

    awk -vline="important line" '/^SECTION 2 BEGIN$/{f=1}f&&$0==line{f=0}f&&/^SECTION END$/{print line;f=0}1'<<EOT
    SECTION 1 BEGIN
    some stuff
    SECTION END
    
    SECTION 2 BEGIN
    some stuff
    some more stuff
    SECTION END
    
    SECTION 2 BEGIN
    some stuff
    some more stuff
    important line
    SECTION END
    
    SECTION 3 BEGIN
    oops
    SECTION END
    EOT
    

    输出:

    SECTION 1 BEGIN
    some stuff
    SECTION END
    
    SECTION 2 BEGIN
    some stuff
    some more stuff
    important line
    SECTION END
    
    SECTION 2 BEGIN
    some stuff
    some more stuff
    important line
    SECTION END
    
    SECTION 3 BEGIN
    oops
    SECTION END
    

    【讨论】:

    • @simon:这只是“这里是文件”。就像您将awk 和最后EOT 行之间的行写入文件并且您对awk 执行&lt;filename 一样。一个例子很容易展示......
    猜你喜欢
    • 2017-10-14
    • 2012-04-30
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多