34

我在 Ruby 中有一个字符串,s(比如说)它可能有任何标准的行尾(\n, \r\n, \r)。我想将所有这些转换为\ns。最好的方法是什么?

这似乎是一个超级常见的问题,但没有太多关于它的文档。显然有简单粗暴的解决方案,但有没有内置的东西来处理这个问题?

优雅、惯用的 Ruby 解决方案是最好的。

编辑:意识到这一点^M并且\r是相同的。但是还是有三种情况。(参见维基百科。)

4

4 回答 4

43

从 ruby​​ 1.9 开始,您可以使用String::encodewithuniversal_newline: true来获取所有新行\n,同时保持编码不变:

s.encode(s.encoding, universal_newline: true)

一旦处于已知的换行状态,您就可以使用:crlf_newline. 例如:将一个未知(可能是混合)结尾的文件转换为CRLF(例如),以二进制模式读取它,然后:

s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)
于 2014-01-08T00:04:51.273 回答
41

最好的只是处理您想要专门更改的两种情况,而不是试图变得太聪明:

s.gsub /\r\n?/, "\n"
于 2009-12-02T22:00:35.933 回答
4

我认为最干净的解决方案是使用正则表达式:

s.gsub! /\r\n?/, "\n"
于 2009-12-02T21:58:31.003 回答
-9

尝试在 NetBeans IDE 上打开它们——它之前问过我,在我从其他地方打开的一个项目中,我是否想修复行尾。我认为也可能有一个菜单选项,但这是我会尝试的第一件事。

于 2009-12-02T21:51:43.860 回答