La normalización de los finales de línea en Ruby
-
11-09-2019 - |
Pregunta
Tengo una cadena en Rubí, s
(por ejemplo) que podría tener cualquiera de los finales de línea estándar (\n
, \r\n
, \r
). Quiero convertir todos aquellos a \n
s. ¿Cuál es la mejor manera?
Este parece ser un problema muy común, pero no hay mucha documentación al respecto. Es obvio que hay soluciones fáciles de crudo, pero ¿hay algo construido en manejar esto?
Soluciones elegantes, idiomáticas-Rubí son los mejores.
EDIT: se dio cuenta de que ^M
y \r
son los mismos. Pero todavía hay tres casos. (Ver Wikipedia .)
Solución
Mejor es sólo para manejar los dos casos que desea cambiar específica y no tratar de conseguir demasiado inteligente:
s.gsub /\r\n?/, "\n"
Otros consejos
Desde Ruby 1.9 se puede utilizar String::encode
con universal_newline: true
para conseguir todas sus nuevas líneas en \n
, manteniendo la codificación sin cambios:
s.encode(s.encoding, universal_newline: true)
Una vez en un estado conocido de nueva línea se puede convertir libremente de un lado a CRLF usando :crlf_newline
. por ejemplo: para convertir un archivo de desconocido (posiblemente mezclada) que termina a CRLF
(por ejemplo), leerlo en modo binario, entonces:
s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)
Creo que la solución más limpia sería utilizar una expresión regular:
s.gsub! /\r\n?/, "\n"
Trate de abrirlos en NetBeans IDE - Su me preguntó antes, en uno de los proyectos que he abierto desde otro lugar, si quería fijar los finales de línea. Creo que podría ser una opción de menú para hacerlo también, pero eso sería lo primero que me gustaría probar.