如何删除文件的第一行并保留更改?

我尝试了此操作,但它擦除了文件的全部内容。 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


评论


使用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

#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看一下moreutilssponge
标准输入中吸收数据,直到在写入
文件之前关闭标准输入的写入结束。它的用法如下:

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


删除空行>