Como posso excluir as linhas que matam os padrões de intervalo em sed? [duplicado]

1

Estou escrevendo sed expressão que tenta imprimir o texto dentro de um intervalo de padrões:

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

Isso basicamente funciona, a saída atual é:

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

Mas eu não quero as linhas contendo os padrões, quero:

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

Eu sei que posso simplesmente direcionar a saída para grep com -v option:

grep -v "Reverse Depends:"

Mas espero que sed tenha uma opção para isso. Eu tentei

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

Mas isso não funciona:

sed: -e expression #1, char 19: unknown command: '-'
    
por the_velour_fog 25.01.2016 / 10:29

1 resposta

3

Basta excluir tudo entre a primeira linha e o primeiro padrão, entre o segundo padrão e a última linha:

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

Observe que essa abordagem falhará se o primeiro padrão ocorrer na primeira linha e a fazendo regexes verificando mais do que o necessário, pode afetar desempenho .

Uma abordagem melhor:

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