如何使用 sed 在文件顶部插入一行?

Dav*_*ave 3 shell scripting sed files

我在 Amazon Linux 上使用 bash shell。我正在尝试在文件顶部插入一行,所以我有

header_line="first_line_of_file"
...
    sed -i "1 i\$header_line" /tmp/$file_title
Run Code Online (Sandbox Code Playgroud)

然而,实际出现在我的文件顶部的是

$header_line
Run Code Online (Sandbox Code Playgroud)

如何告诉 sed 不要按字面解释我的变量,而是使用变量中的值插入到文件顶部?

Kus*_*nda 5

如果您使用的是 GNU 或busybox, sed,那么您应该能够这样做

\n\n
sed -i "1i $header_line" "/tmp/$file_title"\n
Run Code Online (Sandbox Code Playgroud)\n\n

您遇到的问题是由于$从 shell 中转义,因此它无法识别$header_line为变量。

\n\n

使用 NetBSD 或 OpenBSD sed(也适用于 FreeBSD 和 macOS,但需要在-i\'\'之间有一个空格):

\n\n
sed -i\'\' "1i\\\\\n$header_line\n" "/tmp/$file_title"\n
Run Code Online (Sandbox Code Playgroud)\n\n

BSDsed与传统sed实现一样,并且按照 POSIX 的规定,在命令\\后需要一个和一个文字换行符i,并且由于我们使用双引号,因此需要\\从 shell 中转义。

\n\n

另一种选择是使用cat

\n\n
printf \'%s\\n\' "$header_line" | cat - "/tmp/$file_title" >new_file && mv new_file "/tmp/$file_title"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也绕过了 St\xc3\xa9phane Chazelas 在下面的评论中提到的值中的反斜杠问题$header_line

\n