我遇到了这个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”)。