#linux
sed -i 's/\\n/\n/g' linefeed.sql
#macOS
sed -i '' 's/\\n/\n/g' linefeed.sql
Hoje novamente me deparei com um bloco de texto de linha única, ou seja as quebras de linha foram geradas como string texto \n e não como o caracter linefeed ou carriage return como eu esperava.
Bom, não importa, isso acontece eventualmente então fazer a substituição manual via comando sed é a forma mais rápida de alcançar este objetivo.
Explicando rapidamente o comandos acima…
sed é o acrônimo para Stream Editor
-i significa in place, ou seja, vai alterar o próprio arquivo de entrada
's/\\n/\n/g' é um regex pattern, s para substituir, \\n conteúdo a ser substituído, \n conteúdo a ser aplicado, g troca global ou múltiplas ocorrências.
As barras / funcionam apenas como delimitadores do regex pattern.
linefeed.txt é o nome do arquivo de entrada, ou seja o nosso arquivo alvo
Observe que no ambiente MacOS temos uma ligeira diferença onde um parâmetro adicional surge antes do regex pattern. Deu muiiiiiiito trabalho pra descobrir isso!
Criando o arquivo com o conteúdo necessário para simular o problema.
echo 'CREATE TABLE usuario
(\\n id
BIGINT(20) NOT NULL AUTO_INCREMENT,\\n nome
VARCHAR(255) NOT NULL,\\n login
VARCHAR(50) NOT NULL,\\n email
VARCHAR(255) NOT NULL,\\n senha
VARCHAR(50) NOT NULL,\\n telefone_fixo
VARCHAR(50) DEFAULT NULL,\\n telefone_celular
VARCHAR(50) DEFAULT NULL,\\n timezone
VARCHAR(100) DEFAULT NULL,\\n ativo
TINYINT(3) UNSIGNED NOT NULL,\\n created_at
DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),\\n updated_at
DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),\\n PRIMARY KEY (id
),\\n UNIQUE KEY ixu_login
(login
),\\n KEY idx_usuario_created_at
(created_at
),\\n KEY idx_usuario_updated_at
(updated_at
)\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;' > linefeed.sql
Listando e conferindo que temos apenas uma única linha no arquivo.
cat linefeed.sql
Para os amantes do editor vi podemos fazer essa mesma substituição com a seguinte sequência de comandos.
vi linefeed.sql
:1,$ s/\\n/\r/g <enter>
:wq
Observe que neste comando o conteúdo a ser aplicado deve ser \r e não \n
É claro que você poderia se livrar de toda essa parafernália de comandos e simplesmente utilizar um editor de textos que tenha um suporte esperto, como Notepad++ ou VsCode, e simplesmente Localizar e Substituir strings por LF CR.
Mas fica aqui a minha pergunta. Por que você iria querer isto?
Thanks for watching!!!