
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 sed
comando.
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:
:loop
cria um rótulo chamadoloop
p
imprime a linha atualn
busca a próxima linha/SOMETHING/b loop
ramifica paraloop
se a linha corresponder/SOMETHING/
q
se 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.