我有一些文件,如果它是文件中的最后一个字符,我想删除最后一个换行符。 od -c
显示我运行的命令确实在文件中写入了一个尾随的新行:
0013600 n t > \n
我用 sed 尝试了一些技巧,但我能想到的最好的方法是没有做到这一点:
sed -e '$s/\(.*\)\n$/\1/' abc
任何想法如何做到这一点?
原文由 Todd Partridge ‘Gen2ly’ 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一些文件,如果它是文件中的最后一个字符,我想删除最后一个换行符。 od -c
显示我运行的命令确实在文件中写入了一个尾随的新行:
0013600 n t > \n
我用 sed 尝试了一些技巧,但我能想到的最好的方法是没有做到这一点:
sed -e '$s/\(.*\)\n$/\1/' abc
任何想法如何做到这一点?
原文由 Todd Partridge ‘Gen2ly’ 发布,翻译遵循 CC BY-SA 4.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 脚本。
原文由 mklement0 发布,翻译遵循 CC BY-SA 4.0 许可协议
6 回答2.6k 阅读
2 回答1.9k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.6k 阅读
4 回答1.9k 阅读
2 回答1.4k 阅读✓ 已解决
或者,要就地编辑文件:
[编者注:
-pi -e
最初是-pie
,但是,正如几位评论者所指出的并由@hvd解释,后者不起作用。]这在我看到的 awk 网站上被描述为“对 perl 的亵渎”。
但是,在测试中,它起作用了。