Как удалить возврат каретки с помощью Ruby?
Я думал, что этот код будет работать, но регулярное выражение никогда не соответствует rn. я просмотрел данные, которые я читаю в шестнадцатеричном редакторе, и проверил, что в файле действительно есть шестнадцатеричный D и шестнадцатеричный шаблон.
Я также пробовал регулярные выражения /xDxA /m и/x0Dx0A / m, но они также не совпадали.
Это мой код прямо сейчас:
lines2 = lines.gsub( /rn/m, "n" )
if ( lines == lines2 )
print "still the samen"
else
print "made the changen"
end
в дополнение к альтернативам, было бы неплохо знать, что я делаю неправильно (чтобы облегчить некоторые обучение с моей стороны). :)
14 ответов:
что вы получаете, когда вы делаете
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.
использовать строка#strip
возвращает копию str с удаленными начальными и конечными пробелами.
Эл.г
" hello ".strip #=> "hello" "\tgoodbye\r\n".strip #=> "goodbye"
С помощью gsub
string = string.gsub(/\r/," ") string = string.gsub(/\n/," ")
Как правило, когда я имею дело с зачисткой \r или \n, я буду искать оба, делая что-то вроде
lines.gsub(/\r\n?/, "\n");Я обнаружил, что в зависимости от того, как были сохранены данные (используемая ОС, используемый редактор, отношение Юпитера к Io в то время) может быть или не быть новой строки после возврата каретки. Кажется странным, что вы видите оба символа в шестнадцатеричном режиме. Надеюсь, это поможет.
Если вы используете рельсы, есть
squishметод
"\tgoodbye\r\n".squish => "goodbye"
"\tgood \t\r\nbye\r\n".squish => "good bye"
"still the same\n".chomp
или"still the same\n".chomp!http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp
Как насчет следующих?
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>
Я думаю, что ваше регулярное выражение почти завершено-вот что я бы сделал:
lines2 = lines.gsub(/[\r\n]+/m, "\n")в приведенном выше примере я поместил \r и \n в класс (таким образом, не имеет значения, в каком порядке они могут появиться) и добавил квалификатор " + " (так что "\r\n\r\n\r\n" также будет соответствовать один раз, и все это заменено на "\n")
def dos2unix(input) input.each_byte.map { |c| c.chr unless c == 13 }.join end remove_all_the_carriage_returns = dos2unix(some_blob)
Comments