Нормализация окончаний строк в Ruby - PullRequest
28 голосов
/ 03 декабря 2009

У меня есть строка в Ruby, s (скажем), которая может иметь любое из стандартных окончаний строки (\n, \r\n, \r). Я хочу преобразовать все это в \n с. Какой лучший способ?

Кажется, это очень распространенная проблема, но документации по ней немного. Очевидно, есть простые грубые решения, но есть ли что-то встроенное, чтобы справиться с этим?

Элегантные, идиоматические-Ruby решения являются лучшими.

РЕДАКТИРОВАТЬ: понял, что ^M и \r одинаковы. Но есть еще три случая. (См. Википедия .)

Ответы [ 4 ]

39 голосов
/ 08 января 2014

Начиная с 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)
37 голосов
/ 03 декабря 2009

Лучше всего обрабатывать два случая, которые вы хотите изменить, а не пытаться стать слишком умными:

s.gsub /\r\n?/, "\n"
3 голосов
/ 03 декабря 2009

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

s.gsub! /\r\n?/, "\n"
0 голосов
/ 03 декабря 2009

Попытайтесь открыть их в IDE NetBeans - я уже спрашивал меня об одном из проектов, которые я открывал из другого места, хотел ли я исправить окончания строк. Я думаю, что для этого тоже может быть пункт меню, но это будет первое, что я попробую.

...