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
代表插入。
在这里,脚本的第一个非空白字符是W
。sed
有命令的人并不多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 文件的顶部。