2009-12-02 11 views
27

Tengo una cadena en Ruby, s (por ejemplo) que podría tener cualquiera de las terminaciones de línea estándar (\n, \r\n, \r). Quiero convertir todos esos a \n s. ¿Cuál es la mejor manera?Normalización de terminaciones de línea en Ruby

Esto parece un problema súper común, pero no hay mucha documentación al respecto. Obviamente hay soluciones crudas fáciles, pero ¿hay algo incorporado para manejar esto?

Las soluciones elegantes, idiomáticas-Ruby son las mejores.

EDIT: se dio cuenta de que ^M y \r son lo mismo. Pero todavía hay tres casos. (Ver wikipedia.)

Respuesta

35

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" 
+1

Dos cosas: debe poner \ r \ n primero en la expresión regular o de lo contrario nunca coincidirá (porque cualquier cosa que de otra forma coincidiría b \ r \ n se corresponderá primero con \ r). Y '\ n' == "\\ n", mientras que lo que quiere es "\ n". – sepp2k

+0

Cambie las comillas simples por comillas dobles. De lo contrario, no funciona como se esperaba. –

+0

Parece que todos estamos en la misma página :) –

-8

Intenta abrirlos en NetBeans IDE - Me ha preguntado antes, en uno de los proyectos que he abierto desde otro lado, si quería arreglar los finales de línea. Creo que podría haber una opción de menú para hacerlo también, pero eso sería lo primero que intentaría.

+2

gracias, pero esto no es un hecho aislado; esto es para procesar datos en Ruby, no para procesar archivos de Ruby. – Peter

3

creo que la solución más limpia sería utilizar una expresión regular:

s.gsub! /\r\n?/, "\n" 
+0

oops, esto tiene una trampa: los saltos de doble línea como '\ n \ n' se convertirán en' \ n'. – Peter

+0

Vaya, gracias por señalar eso, parece que jleedev fue un poco más rápido. –

29

Desde ruby ​​1.9 se puede utilizar con String::encode: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, puede convertir libremente a CRLF usando :crlf_newline. por ejemplo: para convertir un archivo de desconocido (posiblemente mezclado) que termina a CRLF (por ejemplo), leerlo en modo binario, entonces:

s.encode(s.encoding, :universal_newline => true).encode(s.encoding, :crlf_newline => true) 
+5

No es necesario que incluya el primer 's.encoding', un simple' s.encode (universal_newline: true) 'o' s. encode (crlf_newline: true) 'hace el truco. Esto me ayudó con un proyecto hoy. – Donovan

+0

@Donovan: está _probablemente_ bien, sin embargo, los documentos dicen que la versión sin una codificación explícita se transcodificará a 'Encoding.default_internal', que puede ser o no lo que usted quiere. Mi versión conservará de forma conservadora su codificación actual. – Greg

+1

cierto y usted hace un buen punto, pero en la mayoría de los casos el valor predeterminado está bien, después de todo, eso es lo que utiliza 'String.new'.Entonces, en mi caso (y podría argumentar en la mayoría de los casos), sería redundante. – Donovan

Cuestiones relacionadas