sed
ループ内の.vttテキストファイルセットのリクエスト/ヘッダーにテキストを追加しようとしています。テキストを置き換えずにテキストのみを追加します。
テキストに改行を追加する必要があります。
テキストは次のようにする必要があります。
WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
これが私が試していることです:
for file in *.vtt ; do
sed -i '' 'WEBVTT/nKind: captions/nLanguage: eng/nFile Creation Date: 2023-08' "$file"
done
私にエラーが発生します:
sed: 1: 'WEBVTT/nKind: captions/ ...': invalid command code W
理由はわかりません。二重引用符/二重引用符を切り替えてみましたが、うまくいきませんでした。
ベストアンサー1
次のコマンドを使用する方が簡単で移植性に優れていますperl
。
perl -0777 -ni -e 'print qq(WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
$_)' -- *.vtt
sed
スクリプトは、置換、分岐、挿入などの単一文字である一連の[<address>[,<address>]] <command>
文字で構成されています。<command>
s
b
i
ここでスクリプトの空白以外の最初の文字はですW
。sed
注文する人はあまりありませんW
。あなたのものはそうではありませんが、GNUのようなことではsed
あなたが望むことをしません。
ここでは、ファイルの先頭にいくつかのテキストを挿入したいようです。したがって、アドレスi
sed
としてコマンドを使用できます1
。つまり、最初の行でのみ実行されます(ただしファイルが空の場合(行なし)、まったく実行されません1
)。
sed -i '' -e '1 i\
Kind: captions\
Language: eng\
File Creation Date: 2023-08' -- *.vtt
sed
これはあなたがFreeBSD実装を使用していると仮定します。
GNU実装の場合は、sed
次のようにする必要があります。
sed -si -e '1 i\
Kind: captions\
Language: eng\
File Creation Date: 2023-08' -- *.vtt
ここでは、バックアップサフィックス(ここでは空白)を-i
オプションに追加し、-s
各ファイル間で行番号をリセットする必要があります。
GNUを使用してsed
ファイルにテキストを挿入するには、header
次のようにします。
sed -si -e '0 r header' -- *.vtt
(アドレス0
はGNU拡張であり、アドレス範囲とコマンドでのみ有効です。まだ空のファイルの前に追加されませr
ん。)header