删除文件的第一行

kic*_*s13 150 ksh sed shell-script

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

我试过这个,但它删除了文件的全部内容。

$sed 1d file.txt > file.txt
Run Code Online (Sandbox Code Playgroud)

Asy*_*abs 182

另一个非常轻量级的选项是“拖尾”除第一行之外的所有内容(这通常是删除文件头的简单方法):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout
Run Code Online (Sandbox Code Playgroud)

关注@Evan Teitelman,您可以:

tail -n +2 file.txt | sponge file.txt
Run Code Online (Sandbox Code Playgroud)

避免临时文件。另一种选择可能是:

echo "$(tail -n +2 file.txt)" > file.txt
Run Code Online (Sandbox Code Playgroud)

等等。测试最后一个:

[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 ~]$ 
Run Code Online (Sandbox Code Playgroud)

糟糕,我们丢失了一个换行符(根据下面的 @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 ~]$ 
Run Code Online (Sandbox Code Playgroud)

回到 sed,尝试:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt
Run Code Online (Sandbox Code Playgroud)

也许

echo -e "$(sed '1d' file.txt)\n" > file.txt
Run Code Online (Sandbox Code Playgroud)

以免产生副作用。


jor*_*anm 110

在该命令之后 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
Run Code Online (Sandbox Code Playgroud)

  • `ed` 命令将是: `printf "%s\n" 1d wq | ed file.txt`(我心动了) (7认同)
  • 对于 BSD `sed`,你可以使用 `sed -i .bak '1d' file.txt`。 (3认同)

小智 21

这个话题很有趣,所以我用 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
Run Code Online (Sandbox Code Playgroud)

结论:下面似乎是最快的方法:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


小智 18

也看看spongemoreutils. sponge吸收来自标准输入的数据,直到标准输入的写入结束在写入文件之前关闭。它是这样使用的:

sed '1d' file.txt | sponge file.txt
Run Code Online (Sandbox Code Playgroud)


iru*_*var 10

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

ex -c ':1d' -c ':wq' file.txt
Run Code Online (Sandbox Code Playgroud)

  • ex 确实使用临时文件。`strace -e open ex -c ':1d' -c ':wq' foo`。ex 用临时文件截断原始文件,而 GNU sed 的 -i 选项用临时文件覆盖原始文件。我不确定 BSD 的 sed 是如何工作的。 (2认同)

Ste*_*nny 5

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

ex -s -c '1d|x' file.txt
Run Code Online (Sandbox Code Playgroud)
  1. 1 找到第一行

  2. d 删除

  3. x 保存并关闭