我正在尝试使用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$
答案 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}'
我希望真的删除这个问题,但为时已晚。