从文件中删除最后一行


44

sed 用来快速删除具有特定位置的行

sed '1d'
sed '5d'

但是,如果我想删除文件的最后一行并且不知道行数怎么办(我知道我可以使用wc其他技巧来做到这一点)。

目前,采用一种变通方法与headtail结合wc这样做。这里有任何曲折吗?


哪个操作系统?一些口味有有趣的选择headtail...
尼尔斯

@Nils,我使用的是“ Red Hat Enterprise Linux Server 5.5版(Tikanga)”。你能点的选择headtail你知道在不同的口味?
mtk

是的 见下文。
尼尔斯2012年

Answers:


87

sed中的sed $是最后一行,因此删除最后一行:

sed '$d' <file>

12
用于sed -i '$d' <file>在适当位置编辑文件。
WanderingMind

1
删除最后n行(其中n是任何整数)会是什么?
Joshua Salazar

31

最后一行的$:

sed '$d' file

9
击败您30秒:P
h3rrmiller 2012年

1
遗憾的是,尽管必须使用更复杂的技术来删除最后两行。
dubiousjim 2012年

你什么意思?sed '$d' file; sed '$d' file
罗布2012年

3
@Rob:sed '$d' file实际上并没有修改文件;它只是打印出文件的内容,减去最后一行。因此sed '$d' file; sed '$d' file两次打印出文件内容,每次减去最后一行。的最后两行删除sed '$d' filesed '$d' file | sed '$d'
ruakh 2012年

2
是的,这很微妙,但当然可以。我会一口气做到这一点sed -n '1{h;n;}; $q; x; p;'。我在吹嘘我们不能做得到sed '$-1,$d'
dubiousjim 2012年

14

cat file.txt | head -n -1 > new_file.txt

请注意,根据命令的最后一行file.txt(如果它以EOF,或\n然后结尾)看来,此命令后EOF的行数new_file.txt可能相同(与file.txt)相同(在没有时发生\n)-在任何情况下,最后一行的内容将被删除。

另外,请注意,您必须使用第二个(中间)文件。如果您选择猫并将其重定向到同一文件,则将其删除。


6
在可行的地方,也可能很简单head -n -1 file.txt > new_file.txt。请注意,尽管负数head -n仅适用于的某些实现head。例如,它不适用于FreeBSD或BusyBox版本的head
dubiousjim 2012年

1
@dubiousjim:同意,head -n -1 file.txt > new_file.txt更好。对于我的两个注释,它的工作方式相同(行数相同,并且在同一文件上擦除)。至于否定论点,Unix之间有时会出现这种差异,并且它们常常令人沮丧,因为您希望它完全是同一条命令(为什么您不这样做-名称和目的相同!)点。(我使用Debian。)
Emanuel Berg

5

head --lines=-1。我首先在SLES11SP2系统的手册页(coreutils-8.12-6.23.1)中偶然发现了这种可能性。

tail并且headcoreutils-rpm的一部分(至少对于基于rpm的系统而言)。

根据coreutils的更新日志,从coreutils-version 5.0.1开始支持此语法。

坏消息:根据RH5手册页,此选项未描述

好消息:它可以与RH5一起使用(因此,在您的情况下:它可以-至少与当前版本的RH5一起使用)。

rpm -q coreutils 显示我(在CentOS 5.8上):coreutils-5.97-34.el5_8.1

我不确定是否是RH5.5。已经有支持它的coreutils-version。但是无论如何,5.5都已失效。


+1。它在RH5.5上完美工作。谢谢。
mtk

0

的Linux

$是最后一行,d表示删除:

sed '$d' ~/path/to/your/file/name

苹果系统

相当于sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
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.