sed删除匹配和下一行

时间:2016-11-13 11:50:27

标签: sed

我不确定为什么我的RedGex表达式无效,我正在尝试省略匹配和下一行

[example.com]
10.0.0.1 
10.0.0.2
[example.net]
10.0.0.10
10.0.0.20

期望的输出

[example.net]
10.0.0.10
10.0.0.20

这是我到目前为止所尝试的内容,但它匹配的行数多于预期

   sed -e '/(\[example.com\])(.*\n)+/d'

3 个答案:

答案 0 :(得分:2)

我认为awk更适合此任务

$ awk '/\[example.com\]/{f=1; next} /\[example.*\]/{f=0} !f' ip.txt 
[example.net]
10.0.0.10
10.0.0.20
  • /\[example.com\]/{f=1; next}如果广告符匹配[example.com]设置标记f并转到下一行
  • /\[example.*\]/{f=0}如果行匹配\[example.*\],则取消设置标记
  • !f如果未设置标志,则打印行


使用sed,我能做的最好就是使用answer

$ sed '/\[example.com\]/,/\[example.*\]/ { /\[example.com\]/d; /\[example.*\]/!d }' ip.txt 
[example.net]
10.0.0.10
10.0.0.20

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -n '/^\[[^]*\]/h;G;/\n\[example.com\]/!P;d' file

在遇到您不想匹配的线路时,将所述线路存储在保留空间(HS)中,将其附加到模式空间(PS),如果第二部分执行则仅打印当前线路不包含必需的字符串。

答案 2 :(得分:1)

sed用于单个行上的简单替换,即全部。对于其他任何事情,你应该使用awk来获得软件的每个理想属性(效率,清晰度,健壮性,可移植性,可维护性等等):

$ awk '/^\[/{f=/\[example\.com\]/} f' file
[example.com]
10.0.0.1
10.0.0.2

$ awk '/^\[/{f=/\[example\.com\]/} !f' file
[example.net]
10.0.0.10
10.0.0.20