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

新手上路,请多包涵

我有一些文件,如果它是文件中的最后一个字符,我想删除最后一个换行符。 od -c 显示我运行的命令确实在文件中写入了一个尾随的新行:

 0013600   n   t  >  \n

我用 sed 尝试了一些技巧,但我能想到的最好的方法是没有做到这一点:

 sed -e '$s/\(.*\)\n$/\1/' abc

任何想法如何做到这一点?

原文由 Todd Partridge ‘Gen2ly’ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答
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

笔记:


其他答案的指南

  • 如果 Perl 可用,请选择 公认的答案- 它 简单且节省内存(不会一次读取整个输入文件)。

  • 否则,请考虑 ghostdog74 的 Awk 答案——它 晦涩难懂,但也节省内存;一个 更易读的等价物(POSIX-compliant)是:

  • awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt

  • 打印延迟一行,以便可以在 --- \n END 块中处理最后一行,由于设置了输出记录分隔符( OFS ) 为空字符串。

  • 如果您想要一个 冗长但快速且强大的解决方案,可以 真正就地编辑(而不是创建一个临时文件然后替换原始文件),请考虑 jrockway 的 Perl 脚本

原文由 mklement0 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏