【问题标题】:Remove function from file using sed or awk使用 sed 或 awk 从文件中删除函数
【发布时间】:2016-02-04 14:41:45
【问题描述】:

我想删除函数engine "map" { ... "foobar" ... }

我尝试了很多方法,太难了,因为它最后有空行和'}',分隔符不起作用

mainfunc {

  var = "baz"

  engine "map" {

    func {

      var0 = "foo"
      border = { 1, 1, 1, 1 }
      var1 = "bar"
    }
  }
}

mainfunc {

  var = "baz"

  engine "map" {

    func {

      var0 = "foo"
      border = { 1, 1, 1, 1 }
      var1 = "foobar"
    }
  }
}

... # more functions like 'mainfunc'

我试过了

sed '/engine/,/^\s\s}$/d' file

但删除了所有引擎功能,我只需要包含“foobar”的那个,也许一个模式匹配所有内容,甚至换行符,直到 foobar 是这样的:

sed '/engine(.*)foobar/,/^\s\s}$/d' file

有可能吗?

【问题讨论】:

    标签: linux bash awk command-line sed


    【解决方案1】:

    试试:

    sed '/engine/{:a;N;/foobar/{N;N;d};/  }/b;ba}' filename
    

    或:

    awk '/engine/{c=1}c{b=b?b"\n"$0:$0;if(/{/)a++;if(/}/)a--;if(!a){if(b!~/foobar/)print b;c=0;b="";next}}!c' filename
    

    【讨论】:

    • 伙计,你太棒了!谢谢!
    【解决方案2】:

    当你匹配 engine "map" 时,我会简单地计算开/关括号的数量,不能说这是否只适用于 gawk

    awk '
      /^[ \t]*engine "map"/ {
        ship=1; # ship is used as a boolean
        b=0 # The factor between open / close brackets
      }
      ship {
        b += split($0, tmp, "{"); # Count numbers of { in line
        b -= split($0, tmp, "}"); # Count numbers of } in line
        # If open / close brackets are equal the function ends
        if(b==0) { 
          ship = 0;
        }
        # Ship the rest (printing)
        next;
      }
      1 # Print line
    ' file
    

    Split 返回匹配数:split(string, array [, fieldsep [, seps ] ])

    除法 字符串成由 fieldpat 定义的片段 并将这些片段存储在数组中,并将分隔符字符串存储在 seps 数组。第一部分存储在 array[1]array[2] 中的第二个片段,以此类推 向前。第三个参数 fieldpat 是 描述字符串中字段的正则表达式(就像FPAT 是 描述输入记录中的字段的正则表达式)。 它可以是正则表达式常量或字符串。 如果省略 fieldpat,则使用 FPAT 的值。 patsplit() 返回创建的元素数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2021-03-22
      • 2013-10-08
      • 2023-01-26
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多