需要匹配文件中的唯一字符串,然后删除整个封装的文本

时间:2013-01-02 18:04:44

标签: regex sed awk

每个人的好日子,

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

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

See here in action

  1. 在每个首发(define...)行检查是否包含},如果是,请将该行保存为block
  2. 其他人请先阅读}的下一行,然后将这些行添加到block
  3. 最后检查我们是否要打印出来

答案 2 :(得分:0)

perl的一种方式:

perl -0pe 's/define service[ \t]*\{[^{}]*?NSClient\+\+[ \t]+Version[^{}]*?\}//gs' filename

答案 3 :(得分: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