我正在使用的文件如下所示:
#
# Bulk mode
#
#define command {
# command_name process-service-perfdata-file
# command_line /usr/libexec/pnp4nagios/process_perfdata.pl --bulk /var/log/pnp4nagios/service-perfdata
#}
#define command {
# command_name process-host-perfdata-file
# command_line /usr/libexec/pnp4nagios/process_perfdata.pl --bulk /var/log/pnp4nagios/host-perfdata
#}
#
# Bulk with NPCD mode
#
#define command {
# command_name process-service-perfdata-file
# command_line /bin/mv /var/log/pnp4nagios/service-perfdata /var/spool/pnp4nagios/service-perfdata.$TIMET$
#}
#define command {
# command_name process-host-perfdata-file
# command_line /bin/mv /var/log/pnp4nagios/host-perfdata /var/spool/pnp4nagios/host-perfdata.$TIMET$
#}
我想取消注释“使用NPCD模式批量”标题之后的所有行。到目前为止,我取消了所有内容,包括标题:
sed -E '/Bulk with NPCD mode/,$ {s/^#(.+)/\1/}' /etc/pnp4nagios/misccommands.cfg
在进行任何替换之前,如何让它继续跳过“使用NPCD模式批量”行?我尝试了n
命令,但是转到下一行似乎停止了对剩余行的进一步处理:
sed -E '/Bulk with NPCD mode/,$ {n; s/^#(.+)/\1/}' /etc/pnp4nagios/misccommands.cfg
答案 0 :(得分:2)
使用范围是正确的方法,但是,sed
包括范围中的范围边界,这就是您需要显式跳过包含搜索模式的起始行的原因:
sed '/Bulk with NPCD/,${/Bulk with NPCD/!s/^#//}'
顺便说一句,s/^#//
替换了行开头的哈希值。
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed '/^#.*mode$/h;//!G;/\n# Bulk with NPCD mode$/{/^#\n\|^# Bulk with NPCD mode\n/!s/^#//};P;d' file
将当前模式存储在保留空间中并将其附加到每一行。如果当前模式为Bulk with NPCD mode
,则删除注释字符(如果它不是模式注释行或空注释)。