Как писать в файл с перенаправлением/каналами, если он доступен только для чтения

С 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
-1
20.07.2019, 20:49
1 ответ

Стандартного способа не существует. Вы можете написать программу и использовать ее точно так же, как используютtee

#!/bin/sh
chmod +w "$1"
cat > "$1"
chmod -w "$1"
1
28.01.2020, 05:09

Теги

Похожие вопросы