Stream Editor sed Substituir texto \n por Quebra de Linha via Linha de Comando

#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!!!

Deixe um comentário