Нормализация окончания строк в Ruby
-
11-09-2019 - |
Вопрос
У меня есть строка в Ruby, s
(скажем), которые могут иметь любое из стандартных окончаний строк (\n
, \r\n
, \r
).Я хочу преобразовать все это в \n
с.Какой лучший способ?
Это кажется очень распространенной проблемой, но документации по ней не так уж и много.Очевидно, что существуют простые и грубые решения, но есть ли что-нибудь встроенное, чтобы справиться с этим?
Элегантные, идиоматические решения на Ruby — лучшие.
РЕДАКТИРОВАТЬ:понял, что ^M
и \r
одинаковы.Но есть еще три случая.(Видеть Википедия.)
Решение
Лучше всего просто обработать два случая, которые вы хотите изменить конкретно, и не пытаться хитрить:
s.gsub /\r\n?/, "\n"
Другие советы
Начиная с Ruby 1.9 вы можете использовать String::encode
с universal_newline: true
чтобы поместить все ваши новые строки в \n
сохраняя при этом вашу кодировку без изменений:
s.encode(s.encoding, universal_newline: true)
Попав в известное состояние новой строки, вы можете свободно конвертировать обратно в CRLF, используя :crlf_newline
.например:конвертировать файл неизвестного (возможно смешанного) окончания в CRLF
(например), прочитайте его в двоичном режиме, затем:
s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)
Я думаю, что самым чистым решением было бы использовать регулярное выражение:
s.gsub! /\r\n?/, "\n"
Попробуйте открыть их в среде IDE NetBeans. Раньше в одном из проектов, которые я открывал из другого места, меня спрашивали, хочу ли я исправить окончания строк.Я думаю, что в меню тоже может быть такая опция, но это было бы первое, что я бы попробовал.