Как удалить возврат каретки с помощью Ruby?

Я думал, что этот код будет работать, но регулярное выражение никогда не соответствует \r\n. Я просмотрел данные, которые читаю в шестнадцатеричном редакторе, и проверил, что в файле действительно есть шестнадцатеричный D и шестнадцатеричный шаблон.

Я также пробовал регулярные выражения /\ 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

В дополнение к альтернативам было бы хорошо знать, что я делаю неправильно (чтобы облегчить обучение с моей стороны).:)

Ответ 1

Что вы получаете, когда делаете puts lines? Это даст вам ключ.

По умолчанию File.open открывает файл в текстовом режиме, поэтому ваши символы \r\n будут автоматически преобразованы в \n. Возможно, причина lines всегда равна lines2. Чтобы предотвратить разбор строки Ruby, используйте режим rb:

C:\> copy con lala.txt
a
file
with
many
lines
^Z

C:\> irb
irb(main):001:0> text = File.open('lala.txt').read
=> "a\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(main):003:0>

Но из вашего вопроса и кода я вижу, что вам просто нужно открыть файл с помощью модификатора по умолчанию. Вы не нуждаетесь в каком-либо преобразовании и можете использовать более короткий File.read.

Ответ 2

Используйте Строка # strip

Возвращает копию str с удалением ведущего и конечного пробелов.

например

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

Использование gsub

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

Ответ 3

Обычно, когда я занимаюсь снятием \r или\n, я буду искать оба, делая что-то вроде

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

Я обнаружил, что в зависимости от того, как были сохранены данные (используемая ОС, используемый редактор, отношение Юпитера к Io в то время), может быть или не быть новая строка после возврата каретки. Кажется странным, что вы видите оба символа в шестнадцатеричном режиме. Надеюсь, это поможет.

Ответ 4

modified_string = string.gsub(/\s+/, ' ').strip

Ответ 5

lines2 = lines.split.join("\n")

Ответ 7

Если вы используете Rails, существует способ squish

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

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

Ответ 8

Как насчет следующего?

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>

Ответ 9

Почему бы не прочитать файл в текстовом режиме, а не в двоичном режиме?

Ответ 10

Вы можете использовать это:

my_string.strip.gsub(/\s+/, ' ')

Ответ 11

lines.map(&:strip).join(" ")

Ответ 12

Я думаю, что ваше регулярное выражение почти полностью - вот что я буду делать:

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

В приведенном выше примере я поместил \r и\n в класс (таким образом, это не имеет значения, в каком порядке они могут появиться) и добавили квалификатор "+" (так что "\ r\n\r\n\r\n" также будет совпадать один раз, и все это заменяется на "\n" )