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>s 为单个字符组成,例如s代表替换、b代表分支、i代表插入。

在这里,脚本的第一个非空白字符是Wsed有命令的人并不多W。你的没有,但在那些拥有它的人中,例如 GNU sed,它不会做你想要的事情。

在这里,您似乎想在文件的开头插入一些文本。因此,您可以使用i sed命令 with1作为地址,这意味着它只会在第一行运行(但要注意,如果文件为空(没有行),它根本不会运行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 文件的顶部。

相关内容