使用GNU sed删除尾随换行符

时间:2015-12-13 17:58:42

标签: bash sed cygwin

我正在尝试使用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等,我想坚持使用更多“核心”实用程序。 那么,周围是否有sed大师?我将衷心感谢您的帮助。 我正在使用Cygwin的sed分发。

谢谢。

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

1^M$
^M$
^M$

成为这个:

1$

3 个答案:

答案 0 :(得分:2)

您正在尝试使用错误的工具来完成工作。 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

与其他问题:

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

无论行结尾是DOS还是UNIX,上面都会有效。

答案 1 :(得分:0)

你可以这样使用tr吗?

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

这会转换file1并删除\r\n

答案 2 :(得分:0)

是的,这有效:

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

我希望真的删除这个问题,但为时已晚。