我尝试了此操作,但它擦除了文件的全部内容。 br />
#1 楼
该命令后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
#2 楼
另一种非常轻量级的选择是仅“尾部”除第一行以外的所有内容(通常这是删除文件头的简便方法):# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
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,尝试:效果。
评论
我刚刚在我的Fedora系统上尝试过,输出在上面。您是正确的-感谢您指出这一点。
– AsymLabs
13-10-16在13:02
尾部技巧对我有用(在130mb的文件上花费不到3秒的时间)。谢谢!
–elo80ka
14年8月18日在17:51
echo“ $(tail -n +2 file.txt)”> file.txt是一个完美的答案。
– Alex Raj Kaliamoorthy
16-11-22在12:26
谢谢! echo“ $(tail -n +2 file.txt)”> file.txt对我有用,就像一个魅力!
– Arsenii
19年2月1日在14:01
echo -e答案具有用实际的新行替换文件中的“ \ n”文字的副作用
–穆罕默德·贾法尔·马什哈迪(Mohammad Jafar Mashhadi)
20-2-7在22:20
#3 楼
这个主题很有趣,因此我以3种方式测试基准测试:目标
sed '1d' d.txt > tmp.txt
是5.4GB的文件得到结果:最快的方法:
tail -n +2 d.txt > tmp.txt
评论
您的sed'1d'd.txt方法不包含mv命令(或者通过阅读测试似乎如此)。在我使用20MB文件的FreeBSD上的测试中,sed -i是最快的。
– Sopalajo de Arrierez
18年2月11日在23:04
#4 楼
还可以从sponge
看一下moreutils
。 sponge
从标准输入中吸收数据,直到在写入
文件之前关闭标准输入的写入结束。它的用法如下:
sed '1d' file.txt | sponge file.txt
#5 楼
ex
可用于不包含临时文件的真正的就地编辑ex -c ':1d' -c ':wq' file.txt
评论
ex确实使用了临时文件。 strace -e打开ex -c':1d'-c':wq'foo。 ex用临时文件截断原始文件,而GNU sed的-i选项则用临时文件覆盖原始文件。我不确定BSD的sed如何工作。
–llua
2013年12月5日在16:03
@llua,你是对的。我也注意到了,但是后来
– iruvar
2013年12月5日在16:06
#6 楼
您可以在Ex模式下使用Vim: ex -s -c '1d|x' file.txt
1
查找第一行d
删除x
保存并关闭#7 楼
使用sed
从文件中删除第一行的最简单快捷方式是:$ sed -i -n -e '2,$p' file.txt
#8 楼
此命令将删除1行并另存为“ file.txt”。sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
#9 楼
可以使用vim执行此操作:vim -u NONE +'1d' +wq! /tmp/test.txt
#10 楼
删除文件中的特定行:删除第一行
sed '1d' file
删除第一和第三行
sed '1d3d' file
删除一行中的字符
删除lin中的前两个租约
删除行中的最后两个整流器
sed 's/^..//' file
删除空行>
评论
使用BSD sed,您可以使用sed -i .bak'1d'file.txt。
–user26112
13-10-16在0:37
有没有不包含临时文件的方法?无论如何,这将达到目的。非常感谢!
–kickass13
13-10-16在0:38
@ kickass13可能使用诸如ed之类的文本编辑器。
–jordanm
13-10-16在0:50
ed命令为:printf“%s \ n” 1d w q | ed file.txt(我很爱)
–格伦·杰克曼
13-10-16在1:44
@jonayreyes -exec sed -i'1d'{} \;
–jordanm
17年8月28日在19:12