如何排除与 sed 中的范围模式匹配的行?

如何排除与 sed 中的范围模式匹配的行?

我正在编写sed尝试打印一系列模式内的文本的表达式:

apt-cache showpkg gdm | sed -n '/Reverse Depends:/,/Dependencies:/ p'

这基本上有效,当前输出是:

Reverse Depends: 
  libgdm1:i386,gdm 3.8.3-3~
  ...
  ...
  gnome-control-center-data,gdm 3.0
Dependencies: 

但我不想要包含图案本身的行,我想要:

  libgdm1:i386,gdm 3.8.3-3~
  ...
  ...
  gnome-control-center-data,gdm 3.0

我知道我可以将输出通过管道传输到grep选项-v

grep -v "Reverse Depends:"

但我希望sed有一个选择。我努力了

$ apt-cache showpkg gdm | sed -n '/Reverse Depends:/-1,/Dependencies:/-1 p'

但它不起作用:

sed: -e expression #1, char 19: unknown command: `-'

答案1

只需删除第一行和第一个模式之间、第二个模式和最后一行之间的所有内容:

apt-cache showpkg gdm | sed '1,/Reverse Depends:/d;/Dependencies:/,$d'

请注意,如果您的第一个模式出现在第一行并且进行过多的正则表达式检查会影响性能

更好的方法:

$ apt-cache showpkg gdm |
  sed -n '/Reverse Depends:/{
    :1
    n
    /Dependencies:/q
    p
    b1
  }'

相关内容