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

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

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

答え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ファイルの上部に短いテキストが追加されます。

関連情報