每个人的好日子,
我目前正在尝试编写一个例程来检查特定唯一字符串的文件,然后删除整个封装文本,如下所示:
define service{
use generic-service,srv-pnp
host_name MEVIE.COM
service_description NSClient++ Version
check_command check_nt!CLIENTVERSION
}
文件中有许多define service { ... }
个实例。所以我不能只搜索定义服务,我必须搜索唯一字符串然后删除整个define service { ... }
封装。
例如:
define service{ .... }
define service { .... }
代码。我真的希望我的目标很明确。
我尝试过:sed -n '/NSClient+++ Version/{H;g;p};H' MEVIE.bak|tail -n5 > mevie.fil
..它会返回除最后一个'}'
答案 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
define...
)行检查是否包含}
,如果是,请将该行保存为block
}
的下一行,然后将这些行添加到block
答案 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