如何使用Ruby删除回车?


75

我以为这段代码可以用,但是正则表达式与\ r \ n不匹配。我已经在十六进制编辑器中查看了正在读取的数据,并验证了文件中确实存在十六进制D和十六进制A模式。

我也尝试过正则表达式/ \ xD \ xA / m和/ \ x0D \ x0A / m,但它们也不匹配。

这是我现在的代码:

   lines2 = lines.gsub( /\r\n/m, "\n" )
   if ( lines == lines2 )
       print "still the same\n"
   else
       print "made the change\n"
   end

除了替代方法之外,很高兴知道我在做错什么(以帮助我自己进行一些学习)。:)

Answers:


23

当您做puts lines什么时,您会得到什么?那会给你一个线索。

默认情况File.open下,以文本模式打开文件,因此您的\r\n字符将自动转换为\n。也许这lines就是总是等于的原因lines2。为了防止Ruby解析行尾,请使用rb模式:

C:\>复制con lala.txt
一种
文件
与
许多
线
^ Z

C:\> irb
irb(main):001:0> text = File.open('lala.txt')。read
=>“一个\ nfile \ nwith \ nmany \ nlines \ n”
irb(main):002:0> bin = File.open('lala.txt','rb')。read
=>“ a \ r \ nfile \ r \ nwith \ r \ nmany \ r \ nlines \ r \ n”
irb(主要):003:0>

但是从您的问题和代码中,我看到您只需要使用默认修饰符打开文件。您不需要任何转换,可以使用更短的File.read


2
有一个答案是朝下进一步针对“ Strip换行符”的更多
投票

168

使用String#strip

返回删除前导和尾随空白的str的副本。

例如

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

使用gsub

string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")

5
它不会过滤文本中间的换行符:“ line1 \ n line2” .strip#=>“ line1 \ n line2”
ndrix 2012年

如果在each_line通话中使用,则没关系。
伊恩·沃恩

9
删除所有周围的空格!=删除回车符
Barry Kelly

35

通常,当我处理\ r或\ n剥离时,我会通过做类似的事情来寻找两者

lines.gsub(/\r\n?/, "\n");

我发现,根据数据的保存方式(所使用的操作系统,所使用的编辑器,当时的木星与Io的关系),回车后可能有也可能没有换行符。在十六进制模式下看到两个字符似乎很奇怪。希望这可以帮助。


22

如果您使用的是Rails,有一种squish方法

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"


这是一个很好的提示!
bryanus

2
对于非Rails用户,它的实现方式为str.gsub(/[[:space:]]+/, ' ').strip
sobstel




6

接下来呢?

irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>

要么...

irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>

另外,我检查了:“ \ r \ n”!=“ \ n”。因此,看起来原始的海报代码是正确的。
风铃草

4

我认为您的正则表达式已基本完成-这是我会做的:

lines2 = lines.gsub(/[\r\n]+/m, "\n")

在上面的代码中,我已经将\ r和\ n放入一个类中(这样,它们出现的顺序并不重要),并添加了“ +”限定词(因此,“ \ r \ n \ r \ n \ r \ n“也将匹配一次,并且整个内容都将替换为” \ n“)






0
def dos2unix(input)
  input.each_byte.map { |c| c.chr unless c == 13 }.join
end

remove_all_the_carriage_returns = dos2unix(some_blob)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.