#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 TABLEusuario
(\\nid
BIGINT(20) NOT NULL AUTO_INCREMENT,\\nnome
VARCHAR(255) NOT NULL,\\nlogin
VARCHAR(50) NOT NULL,\\nsenha
VARCHAR(50) NOT NULL,\\ntelefone_fixo
VARCHAR(50) DEFAULT NULL,\\ntelefone_celular
VARCHAR(50) DEFAULT NULL,\\ntimezone
VARCHAR(100) DEFAULT NULL,\\nativo
TINYINT(3) UNSIGNED NOT NULL,\\ncreated_at
DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),\\nupdated_at
DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),\\n PRIMARY KEY (id
),\\n UNIQUE KEYixu_login
(login
),\\n KEYidx_usuario_created_at
(created_at
),\\n KEYidx_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!!!