为什么这个 sed 构造不向空文件中插入任何内容?

为什么这个 sed 构造不向空文件中插入任何内容?

我遇到了这个sed构造,我认为它打算将内容插入到文本文件的第 1 行 - 但它似乎仅在文件具有现有内容时才起作用,并且当文件为空时不执行任何操作。为什么?还有什么更好的构造可以将文本插入到文件的第 1 行,而不管现有文件内容如何?

$ rm -f ./foo
$ touch foo
$ sed -i "1 i\hello world" foo
$ cat ./foo
$ echo "whatever" >> ./foo
$ cat ./foo
whatever
$ sed -i "1 i\hello world" foo
$ cat ./foo
hello world
whatever
$

答案1

Sed 对文件的每一行进行操作,但如果文件没有任何行,则 sed 不会进行操作。通常情况下,awk 提供了更大的灵活性。

尝试 GNU awk

gawk -i inplace 'BEGINFILE{print"hello world"} 1' foo

无论是否foo为空,上面的操作都会起作用。

如果您没有 GNU awk( gawk),那么您需要:

awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo

怎么运行的

在命令行上任何文件开始之前,BEGINFILE{print"hello world"}写入hello world.无论文件是否为空,都会发生这种情况。

对于文件中的每一行,1是 awk 打印该行的简写。

对于 GNU awk,-i inplace相当于 sed 的-i.

答案2

如果您确实想使用sed,您可以执行以下操作:

$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo

无论foo存在或不存在,空或不空,这都会起作用。

第一个命令 ,echo "FPM" >> foo将行“FPM”(可以是您喜欢的任何文本)附加到 ifexists 的foo末尾foo;否则它会创建foo“FPM”行并将其添加到foo.

第二个命令 ,sed -i -e '1i\hello world' -e '$ d' foo在第一行上方插入“hello world” foo,然后删除文件的最后一行(其中包含“FPM”)。

相关内容