1

今天是个好日子,

我目前正在尝试编写一个例程来检查文件中的特定唯一字符串,然后删除整个封装文本,如下所示:

define service{
    use                     generic-service,srv-pnp
    host_name               MEVIE.COM
    service_description     NSClient++ Version
    check_command           check_nt!CLIENTVERSION
    }

文件中有很多实例define service { ... }。所以我不能只搜索定义服务,我必须搜索唯一的字符串然后删除整个define service { ... }封装。

例如:

  • 在文件中找到字符串“NSClient++ Version”...
  • 删除里面的一切define service{ .... }
  • 也删除define service { .... }标签。

我真的希望我的目标很明确。

我试过:sed -n '/NSClient+++ Version/{H;g;p};H' MEVIE.bak|tail -n5 > mevie.fil..它返回除最后一个'}'之外的所有内容

4

4 回答 4

2
awk '
/^define service{/ { inBlock = 1; block = "" }

inBlock {
   block = block $0 ORS
   if (/}/) {
      if (block !~ /NSClient\+\+ Version/)
         printf "%s",block
      inBlock = 0
   }
   next
}

{ print }
' file
于 2013-01-02T19:37:22.450 回答
0

这是使用sed. 像这样运行:

sed -f script.sed file

内容script.sed

:t
/define service{/ , /}/ {
    /}/! {
        $! {
            N;
            bt
        }
    }
    /NSClient++ Version/d;
}

或者,这是单线:

sed ':t /define service{/ , /}/ { /}/! { $! { N; bt } }; /NSClient++ Version/d }' file
于 2013-01-03T00:58:35.133 回答
0

perl 的一种方法:

perl -0pe 's/define service[ \t]*\{[^{}]*?NSClient\+\+[ \t]+Version[^{}]*?\}//gs' filename
于 2013-01-02T19:47:59.193 回答
0

有更短的解决方案,但我曾经这样做:

awk '/^define service/ {
  if ( $0 ~ "}" ) {
    block=$0
  } else {
    block=$0
    while ( block !~ "}" ) {
      getline nl
      block=block "\n" nl      
    }
  }
  if ( block !~ "NSClient\\+\\+ Version" ) { print block } 
}' INPUTFILE > OUTPUTFILE

请参阅此处的实际操作

  1. 在每个起始 ( define...) 行检查它是否包含},如果是,则将该行另存为block
  2. 否则阅读直到下一行}并将这些行添加到block
  3. 最后检查我们是否要打印出来
于 2013-01-02T19:21:00.173 回答