finais de linha normalizando em Ruby
-
11-09-2019 - |
Pergunta
Eu tenho uma string em Ruby, s
(digamos) que pode ter qualquer um dos finais de linha padrão (\n
, \r\n
, \r
). Eu quero converter todos aqueles que \n
s. Qual é a melhor maneira?
Este parece ser um problema super-comum, mas não há muita documentação sobre isso. Obviamente, existem soluções bruto fáceis, mas há algo construído para lidar com isso?
, soluções idiomáticas-rubi elegantes são as melhores.
EDIT: percebeu que ^M
e \r
são os mesmos. Mas ainda há três casos. (Veja wikipedia .)
Solução
O melhor é apenas para lidar com os dois casos que você deseja alterar especificamente e não tentar obter demasiado inteligente:
s.gsub /\r\n?/, "\n"
Outras dicas
Desde o Ruby 1.9 você pode usar String::encode
com universal_newline: true
para obter todas as suas novas linhas em \n
mantendo a sua codificação inalterada:
s.encode(s.encoding, universal_newline: true)
Uma vez em um estado de nova linha conhecida você pode livremente converter de volta para CRLF usando :crlf_newline
. por exemplo: para converter um arquivo de (possivelmente misto) terminando a CRLF
(por exemplo), lê-lo em modo binário, então:
s.encode(s.encoding, universal_newline: true).encode(s.encoding, crlf_newline: true)
Eu acho que a solução mais limpa seria usar uma expressão regular:
s.gsub! /\r\n?/, "\n"
Tente abrir-los no NetBeans IDE - Its me perguntado antes, em um dos projetos que eu abertos a partir de outros lugares, se eu queria corrigir as terminações de linha. Acho que pode ser uma opção de menu para fazê-lo também, mas que seria a primeira coisa que eu tentaria.