Corresponder da linha atual até uma linha que não corresponda a um padrão

Corresponder da linha atual até uma linha que não corresponda a um padrão

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

Eu sei como fazer isso com sed: print da linha atual até a linha que corresponde a ALGO:

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

Mas como faço a mesma coisa, mas imprimo da linha atual até a linha quenãocorresponde 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 quero filtrar e imprimir apenas as 3 primeiras linhas (mas "3" pode variar).

Responder1

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

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

Isto diz: verifique a correspondência com /SOMETHING/. Se a linhanão corresponde(usando !para inverter o resultado do teste) e 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 solicitou e também outras manipulações no arquivo, tudo no mesmo sedcomando.

Responder2

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

Esse:

  • :loopcria um rótulo chamadoloop
  • pimprime a linha atual
  • nbusca a próxima linha
  • /SOMETHING/b loopramifica para loopse a linha corresponder/SOMETHING/
  • qse a ramificação não acontecer.

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

Adaptado deesta pergunta SO.

informação relacionada