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
答え2
ドキュメントに追加したいものはいつでもここに書くことができます。
#!/usr/bin/env bash
tmp=$(mktemp) || exit
trap 'rm -f -- "$tmp"; exit' EXIT
shopt -s nullglob
for file in *.vtt ; do
cat -- - "$file" <<- 'EOF' > "$tmp" &&
WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
EOF
cat -- "$tmp" > "$file"
done
sed -i
一時ファイルは後ろで使用され、上記の内容で明確になりました。文書の先行スペースは次のようになります。タブ、他の種類のスペースではありません。
答え3
awkを使用する方が簡単かもしれません。前に追加されたテキスト行をファイル(addit.txtと呼ばれる)に配置し、次のループを使用します。
$ for file in *.vtt ; do awk -i inplace 'NR==1{system ("cat addit.txt")}1' "$file"; done
これにより、各.vttファイルの上部に短いテキストが追加されます。