删除文件的第一行


110

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

我尝试过此操作,但它会擦除文件的全部内容。

$sed 1d file.txt > file.txt

Answers:


81

该命令后面的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
使用BSD时sed,您可以使用sed -i .bak '1d' file.txt

1
有没有不包含临时文件的方法?无论如何,这将达到目的。非常感谢!
kickass13 13-10-16

@ kickass13可能使用文本编辑器,例如ed
jordanm

6
ed命令将是:printf "%s\n" 1d w q | ed file.txt(I heart ed)
glenn jackman

1
@jonayreyes-exec sed -i '1d' {} \;
jordanm

141

另一种非常轻量级的选择是仅“尾部”除第一行以外的所有内容(这通常是删除文件头的简便方法):

# -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

避免副作用。


我刚刚在我的Fedora系统上尝试过,输出在上面。您是正确的-感谢您指出这一点。
AsymLabs 2013年

这个tail技巧对我有用(在130mb的文件上花了不到3秒的时间)。谢谢!
elo80ka 2014年

echo "$(tail -n +2 file.txt)" > file.txt是完美的答案。
亚历克斯·拉吉·卡利阿莫西

谢谢!echo“ $(tail -n +2 file.txt)”> file.txt对我有用,就像一个魅力!
Arsenii

16

也看看spongemoreutilssponge从标准输入中吸收数据,直到在写入文件之前关闭标准输入的写入结束。它的用法如下:

sed '1d' file.txt | sponge file.txt

14

这个主题很有趣,因此我通过3种方式测试基准测试:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. 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中,速度最快。
Sopalajo de Arrierez

9

ex可用于不涉及临时文件的真正的就地编辑

ex -c ':1d' -c ':wq' file.txt

2
ex确实使用了临时文件。strace -e open ex -c ':1d' -c ':wq' foo。ex会用临时文件截断原始文件,而GNU sed的-i选项会用临时文件覆盖原始文件。我不确定BSD的sed如何工作。
llua 2013年

@llua,你是对的。我也注意到了,但是后来
iruvar

3

使用以下方法从文件中删除第一行的最简单快捷方式sed是:

$ sed -i -n -e '2,$p' file.txt

3

您可以在Ex模式下使用Vim:

ex -s -c '1d|x' file.txt
  1. 1 找到第一行

  2. d 删除

  3. x 保存并关闭



0

删除文件中的行

  1. 删除第一行

sed'1d'文件

  1. 删除第一和第三行

sed'1d3d'文件

删除行中的字符

1删除林中的前两个包机

sed的s /^..//文件

2删除最后两个幽门螺杆菌系

sed的s / ..£//文件

3删除空白行

sed'/ ^£/ d'文件


4
英国人重新占领了殖民地吗?我上一次看,£$
G-Man

£指示多莱尔符号..
的Vivek Parikh的

0

可以使用vim来做到这一点:

vim -u NONE +'1d' +wq! /tmp/test.txt

-2

猫file01 | sed -e'1,3d'

//显示file01中的内容,但删除第一行和第三行


2
您输入的sed命令将删除行1,行2和行
3。– icarus

1
这将删除比要求更多的内容,并且不会“保留更改”
Jeff Schaller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.