sed "無効なコマンドコード W"

sed

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>sbi

ここでスクリプトの空白以外の最初の文字はですWsed注文する人はあまりありません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

おすすめ記事