使用 GNU sed 删除尾随换行符

Remove trailing newlines using GNU sed

我正在尝试使用 sed 单行删除尾随换行符,使用 handy sed one-liners:

之一
sed --in-place -e :a -e '/^\n*$/{$d;N;ba}'

它适用于 UNIX 风格的换行符,但不适用于 DOS 风格的换行符。 尽管我无法完全理解 sed 脚本语法和匹配规则,但我尝试了这个:

sed --binary --in-place -e :a -e '/^\(\r\?\n\)*$/{$d;N;ba}'

但没有用,我也不知道为什么。

我真的不想使用 Perl 等,我想坚持使用更多 "core" 实用程序。 那么,周围有 sed 大师吗?我将衷心感谢您的帮助。 我正在使用 Cygwin 的 sed.

发行版

谢谢。

具体来说,我想要这个文件(使用cat -A打印出来):

1^M$
^M$
^M$

变成这样:

1$

你能像这样使用tr吗?

tr -d '\r\n' < file1 > tempfile && mv tempfile file1

这会翻译 file1 并删除 \r\n

您正在尝试使用错误的工具来完成这项工作。 sed 用于在单行上进行简单替换,仅此而已。对于任何看起来更有趣的东西,你应该使用 awk,例如GNU awk 的一种方法是:

$ cat -v file
1^M
^M
^M
$ awk -v RS='^$' -v ORS= '{sub(/(\r?\n)+$/,"\n")}1' file | cat -v
1

与其他 awks:

$ awk '{rec = rec [=11=] RS} END{sub(/(\r?\n)+$/,"\n",rec); printf "%s",rec}' file | cat -v
1

无论行尾是 DOS 还是 UNIX,上面的方法都有效。

是的,这有效:

sed --binary --in-place -e :a -e '/^\(\r\n\)*\r$/{$d;N;ba}'

真的很想删除问题,但为时已晚。