如何删除文件的第一行并保留更改?
我尝试了这个,但它删除了文件的全部内容。
$sed 1d file.txt > file.txt
答案1
另一种非常轻量级的选项是“拖尾”除第一行之外的所有内容(这通常是删除文件头的简单方法):
# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
关注@Evan Teitelman,您可以:
tail -n +2 file.txt | sponge file.txt
以避免临时文件。另一种选择可能是:
echo "$(tail -n +2 file.txt)" > file.txt
等等。测试最后一项:
[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5
[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$
哎呀,我们丢失了换行符(根据下面的 @1_CR 评论),请尝试:
printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5
[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$
回到 sed,尝试:
printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
也许
echo -e "$(sed '1d' file.txt)\n" > file.txt
以免产生副作用。
答案2
该命令之后 file.txt 为空的原因是 shell 执行操作的顺序。该行发生的第一件事是重定向。文件“file.txt”被打开并截断为 0 字节。之后 sed 命令运行,但此时文件已为空。
有几个选项,大多数涉及写入临时文件。
sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file
perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file
答案3
这个话题很有趣,所以我通过三种方式测试基准:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
sed -i '1d' d.txt
请注意,目标d.txt
是 5.4GB 文件
得到结果:
run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s
结论:以下似乎是最快的方法:
sed '1d' file.txt > tmpfile; mv tmpfile file.txt
答案4
ex
可用于不涉及临时文件的真正就地编辑
ex -c ':1d' -c ':wq' file.txt