
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 sed
comando.
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:
:loop
crea una etiqueta llamadaloop
p
imprime la línea actualn
busca la siguiente línea/SOMETHING/b loop
se ramificaloop
si la línea coincide/SOMETHING/
q
si 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.