perl -pe 'chomp if eof' filename >filename2 或者,要就地编辑文件: perl -pi -e 'chomp if eof' filename [编者注: -pi -e 最初是 -pie ,但是,正如几位评论者所指出的并由@hvd解释,后者不起作用。] 这在我看到的 awk 网站上被描述为“对 perl 的亵渎”。 但是,在测试中,它起作用了。 原文由 pavium 发布,翻译遵循 CC BY-SA 3.0 许可协议
您可以利用 shell 命令替换 删除尾随换行符 这一事实: 适用于 bash、ksh、zsh 的简单形式: printf %s "$(< in.txt)" > out.txt 便携式(POSIX 兼容)替代方案(效率稍低): printf %s "$(cat in.txt)" > out.txt 如果 in.txt 以 多个 换行符结尾,则命令替换会删除 所有 这些。谢谢, Sparhawk (除了尾随换行符之外,它不会删除空格字符。) 由于这种方法 将整个输入文件读入内存,因此只建议较小的文件。 printf %s 确保没有新行附加到输出(它是非标准 echo -n 的符合 POSIX 的替代方案;参见 http://pubs.opengroup.org/onlinepubs/009696799/实用程序/echo.html 和 https://unix.stackexchange.com/a/65819 ) 如果 Perl 可用,请选择 公认的答案- 它 简单且节省内存(不会一次读取整个输入文件)。 否则,请考虑 ghostdog74 的 Awk 答案——它 晦涩难懂,但也节省内存;一个 更易读的等价物(POSIX-compliant)是: awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt 打印延迟一行,以便可以在 --- \n END 块中处理最后一行,由于设置了输出记录分隔符( OFS ) 为空字符串。 如果您想要一个 冗长但快速且强大的解决方案,可以 真正就地编辑(而不是创建一个临时文件然后替换原始文件),请考虑 jrockway 的 Perl 脚本。