Suponiendo que sus datos están en un archivo llamado input
y que input
es un archivo de texto unix ( \n
para los finales de línea, no \r
(Mac OS tradicional) ni los \r\n
(avances en la línea de Internet)):
$ cat input
Heading
FIELD_DELIM TABS
VIDEO_FORMAT 1080
FILM_FORMAT 35mm, 4 perf
AUDIO_FORMAT 48khz
FPS 24
Column
Name Tape Start Source File End Tc in Tracks
Data
WTF0567_comp_v446.15068 00:00:41:16 WTF0567_comp_v446.15068.mov 00:00:43:19 04:02:37:21 V
OMG5120_fx_v001 00:00:42:11 OMG5120_fx_v001.mov 00:00:43:20 02:14:42:17 V
NAW0366_anim_v032 00:00:41:16 GTP0170_MPC_comp_v0219.mov 00:00:44:21 01:02:20:05 V
el sed
puede imprimir líneas ( p
), pero dejará de hacerlo ( q
) al encontrar una línea que comienza con Data
. Las pulsaciones de teclas eran bastante caras en los días del módem de 300 baudios, por eso los comandos de una sola letra.
$ sed -n '/^Data/q;p' input
Heading
FIELD_DELIM TABS
VIDEO_FORMAT 1080
FILM_FORMAT 35mm, 4 perf
AUDIO_FORMAT 48khz
FPS 24
Column
Name Tape Start Source File End Tc in Tracks
Para salir "después" del Data
sólo hay que manipular un poco la lógica, o añadir un Data
línea de nuevo utilizando un subshell para agrupar la salida con el sed
comando:
sed '/^Data/q' input
( sed -n '/^Data/q;p' input; printf "Data\n" )
O bien, puede utilizar awk
que aquí es más o menos lo mismo que el sed
sólo que más verboso:
$ awk '/^Data/{exit} {print}' input
Heading
FIELD_DELIM TABS
VIDEO_FORMAT 1080
FILM_FORMAT 35mm, 4 perf
AUDIO_FORMAT 48khz
FPS 24
Column
Name Tape Start Source File End Tc in Tracks
awk
probablemente hace más fácil forzar la inclusión de su última línea es requisito en blanco ( sed
puede hacer esto pero es más molesto, o no, dependiendo de la versión exacta de sed
implicados):
awk '/^Data/{print "this line left blank";exit} {print}'
awk '/^Data/{print "";exit} {print}'
awk '/^Data/{print;exit} {print}' input
También puede hacerlo en bash
pero bash
no es realmente una buena opción para esto en comparación con sed
o awk
o realmente cualquier otra cosa, y sería mucho más lento. Pero, ya que preguntaste...
while IFS= read -r line || [[ -n $line ]]; do [[ $line = Data* ]] && break; printf '%s\n' "$line"; done < input
Ver lo que quiero decir acerca de bash
? Vaya.
( sed
y awk
no son bash
comandos; bash
(1989) no existía cuando sed
fue escrito (1974). bash
puede ejecutar comandos unix, pero también cualquier otro shell unix, por ejemplo sh
, ksh
, zsh
, fish
, etc. y lo mismo puede hacer cualquier programa unix que haga un exec(3)
a no ser que te refieras a bash en una especie de "¡esto es unix! Conozco unix!" en el sentido de (Jurrasic Park, 1993), como si "google" significara buscar, tal vez sin usar nada hecho por Google. Sólo uno de los comandos anteriores fue realmente ejecutado bajo bash
por ejemplo).