С GNU sed
иtac
:
tac file | \
sed -E '/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}$/ { H; x; s/^\n//; s/\n/ --> /; }' | \
tac
То же самое можно было бы написать и с традиционным sed
(, т.е. без -E
), но это было бы более многословно.
С GNU awk
иtac
:
tac file | \
gawk --re-interval '
/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3} --> / { old = $1 }
/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}$/ { if(old != "") $0 = $0 " --> " old; old = $1 }
1' | \
tac
Обратите внимание, что версия awk
может обрабатывать временные интервалы, такие как 00:00:14.610 --> 00:00:25.500
, во входном файле, в то время как версия sed
их обманывает.
Также обратите внимание, что tac
можно эмулировать с помощью sed
:
sed -n '1!G; $p; h'
или вот так:
sed '1!G; h; $!d'
Однако обе формы будут загружать весь входной файл в память, поэтому они не очень эффективны.
Результат:
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
Стандартного способа не существует. Вы можете написать программу и использовать ее точно так же, как используютtee
#!/bin/sh
chmod +w "$1"
cat > "$1"
chmod -w "$1"