Answers:
该命令后面的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
ed
。
ed
命令将是:printf "%s\n" 1d w q | ed file.txt
(I heart ed)
-exec sed -i '1d' {} \;
另一种非常轻量级的选择是仅“尾部”除第一行以外的所有内容(这通常是删除文件头的简便方法):
# -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
避免副作用。
tail
技巧对我有用(在130mb的文件上花了不到3秒的时间)。谢谢!
echo "$(tail -n +2 file.txt)" > file.txt
是完美的答案。
也看看sponge
从
moreutils
。sponge
从标准输入中吸收数据,直到在写入文件之前关闭标准输入的写入结束。它的用法如下:
sed '1d' file.txt | sponge file.txt
这个主题很有趣,因此我通过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
sed '1d' d.txt
方法不包含(或通过阅读测试似乎没有)mv
命令。在我使用20MB文件的FreeBSD上的测试sed -i
中,速度最快。
ex
可用于不涉及临时文件的真正的就地编辑
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
。ex会用临时文件截断原始文件,而GNU sed的-i选项会用临时文件覆盖原始文件。我不确定BSD的sed如何工作。
此命令将删除1行并另存为“ file.txt”。
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
删除文件中的行
sed'1d'文件
sed'1d3d'文件
删除行中的字符
1删除林中的前两个包机
sed的s /^..//文件
2删除最后两个幽门螺杆菌系
sed的s / ..£//文件
3删除空白行
sed'/ ^£/ d'文件
£
≠ $
。
猫file01 | sed -e'1,3d'
//显示file01中的内容,但删除第一行和第三行
sed
,您可以使用sed -i .bak '1d' file.txt
。