替换匹配行后的文本行

时间:2016-03-15 23:31:58

标签: sed

我正在使用的文件如下所示:

#
# 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

2 个答案:

答案 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,则删除注释字符(如果它不是模式注释行或空注释)。