Por ejemplo, transfiera a continuación
00:00:10.730
this presentation is delivered by the
00:00:13.230
Stanford center for professional
00:00:14.610
development okay so let's get started
00:00:25.500
with today's material so um welcome back
00:00:32.399
to the second lecture what I want to do
a
00:00:10.730 --> 00:00:13.230
this presentation is delivered by the
00:00:13.230 --> 00:00:14.610
Stanford center for professional
00:00:14.610 --> 00:00:25.500
development okay so let's get started
00:00:25.500 --> 00:00:32.399
with today's material so um welcome back
00:00:32.399
to the second lecture what I want to do
text-processing
awk
sed
video-subtitles
arroyo hong
fuente
fuente
Respuestas:
En aras de la claridad del código, estamos utilizando
GNU sed
:Resultados
Explicación
fuente
Con un enfoque de gawk único para archivos relativamente "pequeños" (por tamaño):
La salida:
fuente
Con GNU
sed
ytac
:Lo mismo podría escribirse con tradicional
sed
(es decir, sin-E
), pero sería más detallado.Con GNU
awk
ytac
:Tenga en cuenta que la
awk
versión puede manejar intervalos de tiempo como00:00:14.610 --> 00:00:25.500
en el archivo de entrada, mientras que lased
versión es engañada por ellos.Tenga en cuenta también que
tac
se puede emular consed
:o así:
Sin embargo, ambos formularios cargarán todo el archivo de entrada en la memoria, por lo que no son muy eficientes.
Resultado:
fuente
Veo bucles o tuberías a otras herramientas en las respuestas dadas, y no me gusta eso si no es necesario. Me gustan las frases sencillas:
Pero vamos paso a paso:
^[0-9:.]+$
como expresión regular extendida para la línea de marca de tiempo. Esto debería ser suficiente en el mundo real, pero siéntase libre de hacerlo más preciso. Utilizo este patrón como una dirección, por lo que todo dentro del{}
par se ejecuta solo para las líneas de marca de tiempo.sed
H
espacio anterior yx
cambiamos el patrón y mantenemos el espacio. De esta manera, la marca de tiempo actual ya está guardada en el espacio de espera para el siguiente ciclo, mientras que todo lo que necesitamos está en el espacio del patróns
ubstitute:s/(.*)\n(.*)\n(\n)(.*)/\1 --> \4\3\2\3/
-\1
es la marca de tiempo de inicio,\2
es la línea de texto,\3
es una nueva línea (la necesitamos en el reemplazo, pero POSIX no define\n
en el reemplazo) y\4
es la marca de tiempo de finalización. Parece más complicado de lo que es.p
a las
ubicación y luegod
elegir el espacio del patrón nos evita la salida no deseada para la primera línea cuando el espacio de espera todavía estaba vacío.H
espacio anterior yx
cambie de nuevo los búferes, de modo que las líneas recogidas en el espacio de espera se imprimirán incluso sin cerrar la marca de tiempoSi alguien todavía siente
sed
que no es elegante, no puedo evitarlo.fuente