linux删除最后一个换行符,如果它是文件中的最后一个字符,如何删除换行符?…

  • Post author:
  • Post category:linux


perl -pe ‘chomp if eof’ filename >filename2

或者,编辑文件到位:

perl -pi -e ‘chomp if eof’ filename

[编者注: -pi -e本来就是-pie ,但正如几位评论者所指出的那样,由@hvd解释,后者不起作用。]

这在我看到的awk网站上被形容为“perl blasphemy”。

但是,在一个testing中,它的工作。

您可以利用shell 命令replace删除结尾换行符的事实:

在bash,ksh,zsh中工作的简单forms:

printf %s “$(< in.txt)” > out.txt

便携式(符合POSIX)替代scheme(效率稍低):

printf %s “$(cat in.txt)” > out.txt

注意:

如果in.txt以多个换行符结尾,则命令replace将删除所有这些 – 谢谢@Sparhawk。 (它不会删除尾随换行符以外的空格字符。)

由于此方法将整个input文件读入内存 ,因此build议使用较小的文件。

printf %s确保没有新行被添加到输出(这是符合POSIX标准的非标准echo -n ;请参阅http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html和https: //unix.stackexchange.com/a/65819 )

其他答案的指南 :

如果Perl是可用的,去接受的答案 – 它是简单的和高效的内存 (不会一次读取整个input文件)。

否则,考虑ghostdog74的awk答案 – 这是晦涩的,但也是内存效率 ; 一个更具可读性的等价物 (POSIX兼容)是:

awk ‘NR > 1 { print prev } { prev=$0 } END { ORS=””; print }’ in.txt

由于将输出logging分隔符( OFS )设置为空string,因此打印被延迟一行,因此最后一行可以在END块中处理,在该块中打印时没有尾随\n 。

如果你想要一个详尽而又快速和健壮的解决scheme来真正地进行编辑 (而不是创build一个临时文件,然后replace原来的文件),请考虑jrockway的Perl脚本 。

你可以用GNU coreutils来做这个,它支持相对于文件末