Normaliser les fins de ligne en Ruby
J'ai une chaîne en Ruby, s
(dire) ce qui peut avoir n'importe quel type de fin de ligne (\n
, \r\n
, \r
). Je veux convertir tous ceux \n
s. Quelle est la meilleure façon?
Cela semble être un super-problème commun, mais il n'y a pas beaucoup de documentation à ce sujet. Évidemment, il est facile brut des solutions, mais est-il rien de construit à gérer cela?
Élégant, idiomatiques-Ruby solutions sont les meilleures.
EDIT: réalisé que ^M
et \r
sont les mêmes. Mais il y a encore trois cas. (Voir wikipédia.)
Vous devez vous connecter pour publier un commentaire.
Meilleur, c'est juste pour gérer les deux cas que vous souhaitez modifier spécifiquement et de ne pas essayer de trop malin:
\n
->\n
est inutile. n'a pas tout à fait le réaliser dans un premier temps 🙂os.linesep
?Depuis ruby 1.9, vous pouvez utiliser
String::coder
avecuniversal_newline: true
pour obtenir toutes vos nouvelles lignes dans\n
tout en gardant votre encodage inchangé:Une fois dans un célèbre saut de ligne et l'état, vous pouvez librement convertir retour à CRLF à l'aide de
:crlf_newline
. par exemple: pour convertir un fichier inconnu (éventuellement mélangé) se terminant àCRLF
(par exemple), lire en mode binaire, puis :s.encoding
, une simples.encode(universal_newline: true)
ous.encode(crlf_newline: true)
fait le tour. Cela m'a aidé avec un projet aujourd'hui.Encoding.default_internal
, qui peut ou peut ne pas être ce que vous voulez. Ma version conservatrice de préserver votre codage en cours.String.new
utilise. Donc, dans mon cas (et je pourrais argumenter la plupart des cas), il serait redondant.s.gsub(/\r\n?/, "\n")
,s.gsub("\r\n", "\n").gsub("\r", "\n")
(environ la même vitesse), ets.split(/\r\n?/).join("\n")
Je pense que la solution la plus propre serait d'utiliser une expression régulière:
\n\n
deviendra\n
.Essayer de les ouvrir sur NetBeans IDE - Son m'a demandé avant, sur l'un des projets que j'ai ouvert d'ailleurs, si j'ai voulu fixer les fins de ligne. Je pense qu'il y a peut-être une option de menu pour le faire aussi, mais ce serait la première chose que je voudrais essayer.