Hacer coincidir desde la línea actual hasta una línea que no coincide con un patrón

Hacer coincidir desde la línea actual hasta una línea que no coincide con un patrón

Realmente intenté buscar pero no pude encontrar nada (es difícil saber qué buscar exactamente).

Sé cómo hacer esto con sed: imprimir desde la línea actual hasta la línea que coincide con ALGO:

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

Pero ¿cómo hago lo mismo, pero imprimo desde la línea actual hasta la línea queno escoincide con ALGO?

por ejemplo, canalice esto en sed:

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

Luego quiero filtrar e imprimir solo las primeras 3 líneas (pero "3" puede variar).

Respuesta1

Puede que esto no sea tan general como lo que realmente desea, pero aquí tiene un punto de partida:

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

Esto dice: verifique que coincida con /SOMETHING/. si la lineano coincide(usando !para invertir el resultado de la prueba), luego salga. De lo contrario, imprima esta línea y continúe con la siguiente.

Esto no es lo suficientemente flexible de inmediato como para permitirle hacer lo que solicitó y también otras manipulaciones en el archivo, todo con el mismo sedcomando.

Respuesta2

Puedes probar un bucle en sed:

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

Este:

  • :loopcrea una etiqueta llamadaloop
  • pimprime la línea actual
  • nbusca la siguiente línea
  • /SOMETHING/b loopse ramifica loopsi la línea coincide/SOMETHING/
  • qsi la sucursal no sucede.

Esto imprime una línea en cualquier caso. (Probablemente se pueda solucionar con la respuesta de G-Man).

Adaptado deesta pregunta SO.

información relacionada