如果下一行与sed模式匹配,如何删除下一行?

如果下一行与sed模式匹配,如何删除下一行?,sed,Sed,若下一行和模式匹配,我就无法删除下一行。 例如: define service{ host_name A notification_period F } define service{ host_name A notification_period metrologie notification_period F } 我检查一下你的指纹。若下一行包含通知期,我想删除第F行通知期 我试着用sed'/metrolo

若下一行和模式匹配,我就无法删除下一行。 例如:

define service{
host_name               A
notification_period     F
}


define service{
host_name               A
notification_period     metrologie
notification_period     F
}
我检查一下你的指纹。若下一行包含通知期,我想删除第F行通知期

我试着用sed'/metrologie/{h;d;}/通知期/{x;!d;}'$file

但它将字符串转换为:

define service{
host_name               A

}


define service{
host_name               A
notification_period     metrologie
}
我希望此输出:

define service{
host_name               A
notification_period     F
}


define service{
host_name               A
notification_period     metrologie
}
你可以用

sed '/metrologie/{N;/\n.*notification_period/{s/\n.*//}}' file

详细信息

  • /metrologie/
    -查找带有
    metrologie
    然后
    • N-读取模式空间的下一行,前一行有换行符
    • /\n.*notification\u period/
      -尝试将模式空间中的当前文本与模式匹配的换行符、任何0+字符、
      notification\u period
    • {s/\n.*/}
      -如果上述模式匹配,请将换行符及其后的所有内容替换为空字符串
您可以使用

sed '/metrologie/{N;/\n.*notification_period/{s/\n.*//}}' file

详细信息

  • /metrologie/
    -查找带有
    metrologie
    然后
    • N-读取模式空间的下一行,前一行有换行符
    • /\n.*notification\u period/
      -尝试将模式空间中的当前文本与模式匹配的换行符、任何0+字符、
      notification\u period
    • {s/\n.*/}
      -如果上述模式匹配,请将换行符及其后的所有内容替换为空字符串
这可能适合您(GNU-sed):

如果一行包含
metrologie
打印并获取下一行。如果该行包含
notification\u period
将其删除,否则重复该行。

这可能适用于您(GNU sed):


如果一行包含
metrologie
打印并获取下一行。如果该行包含
notification\u period
将其删除,否则重复。

因此,我的解决方案的区别在于,包含
notification\u period
行下方的所有行都将被删除,对吗?@WiktorStribiżew no,区别在于,如果
metrologie
下面的一行不包含
通知期
,则不会忘记该行,而是测试该行是否也包含
metrologie
。在您的解决方案中,如果条件为真,则删除该行,但如果条件为假,则不再测试该行。因此,与我的解决方案的区别在于,包含
通知期的
metrologie
行下的所有行都被删除,对吗?@WiktorStribiżew no,区别在于,如果
metrologie
下面的一行不包含
通知期
,则不会忘记该行,而是测试该行是否也包含
metrologie
。在您的解决方案中,如果条件为真,则删除该行,如果条件为假,则不再测试该行。