Corresponde da linha atual até uma linha que não corresponde a um padrão

2

Eu realmente tentei pesquisar, mas não consegui encontrar nada (é difícil saber exatamente o que procurar).

Eu sei como fazer isso com sed : imprimir da linha atual até a linha que corresponde a ALGUMA COISA:

sed -n '/1/,/SOMETHING/p'

Mas como faço a mesma coisa, mas imprimo a partir da linha atual até a linha que não corresponde a ALGUMA COISA?

por exemplo. canalize isso para sed :

blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
NO MATCH HERE

Então eu quero filtrar e imprimir apenas as 3 primeiras linhas (mas "3" pode variar).

    
por user3373520 06.10.2014 / 22:59

2 respostas

1

Isso pode não ser tão geral quanto o que você realmente quer, mas aqui está um ponto de partida:

 sed -n '/SOMETHING/!q;p'

Isso diz: verifique a correspondência para /SOMETHING/ . Se a linha não corresponder (usando ! para inverter o resultado do teste), saia. Caso contrário, imprima esta linha e continue na próxima linha.

Isso não é imediatamente flexível o suficiente para permitir que você faça o que você pediu, e também outras manipulações no arquivo, todas no mesmo comando sed .

    
por 06.10.2014 / 23:23
1

Você pode tentar um loop em sed :

$ sed -n '{:loop p; n; /SOMETHING/b loop; q}' test.txt 
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah

Isto:

  • :loop cria um rótulo chamado loop
  • p imprime a linha atual
  • n busca a próxima linha
  • /SOMETHING/b loop ramifica para loop se a linha corresponder a /SOMETHING/
  • q se o ramo não acontecer.

Isto imprime uma linha em qualquer caso. (Provavelmente pode ser corrigido com a resposta do G-Man.)

Adaptado de esta pergunta da SO .

    
por 06.10.2014 / 23:29