{"id":435,"date":"2023-04-21T00:01:33","date_gmt":"2023-04-21T00:01:33","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=435"},"modified":"2023-04-21T00:08:24","modified_gmt":"2023-04-21T00:08:24","slug":"stream-editor-sed-substituir-texto-n-por-quebra-de-linha-via-linha-de-comando","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2023\/04\/21\/stream-editor-sed-substituir-texto-n-por-quebra-de-linha-via-linha-de-comando\/","title":{"rendered":"Stream Editor sed Substituir texto \\n por Quebra de Linha via Linha de Comando"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>#linux\nsed -i 's\/\\\\n\/\\n\/g' linefeed.sql\n\n#macOS\nsed -i '' 's\/\\\\n\/\\n\/g' linefeed.sql<\/code><\/pre>\n\n\n\n<p>Hoje novamente me deparei com um bloco de texto de linha \u00fanica, ou seja as quebras de linha foram geradas como string texto <strong>\\n<\/strong> e n\u00e3o como o caracter <strong>linefeed <\/strong>ou <strong>carriage return<\/strong> como eu esperava.<\/p>\n\n\n\n<p>Bom, n\u00e3o importa, isso acontece eventualmente ent\u00e3o fazer a substitui\u00e7\u00e3o manual via comando <strong>sed<\/strong> \u00e9 a forma mais r\u00e1pida de alcan\u00e7ar este objetivo.<\/p>\n\n\n\n<p>Explicando rapidamente o comandos acima&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sed<\/strong> \u00e9 o acr\u00f4nimo para Stream Editor\n\n<strong>-i<\/strong> significa <strong>in place<\/strong>, ou seja, vai alterar o pr\u00f3prio arquivo de entrada\n\n<strong>'s\/\\\\n\/\\n\/g'<\/strong> \u00e9 um <strong>regex pattern<\/strong>, <strong>s<\/strong> para substituir, <strong>\\\\n<\/strong> conte\u00fado a ser substitu\u00eddo, <strong>\\n<\/strong> conte\u00fado a ser aplicado, <strong>g<\/strong> troca global ou m\u00faltiplas ocorr\u00eancias.\n\nAs barras <strong>\/<\/strong> funcionam apenas como delimitadores do <strong>regex pattern<\/strong>.\n\n<strong>linefeed.txt<\/strong> \u00e9 o nome do arquivo de entrada, ou seja o nosso arquivo alvo <\/code><\/pre>\n\n\n\n<p>Observe que no ambiente <strong>MacOS<\/strong> temos uma ligeira diferen\u00e7a onde um par\u00e2metro adicional surge antes do <strong>regex pattern<\/strong>. Deu muiiiiiiito trabalho pra descobrir isso!<\/p>\n\n\n\n<p>Criando o arquivo com o conte\u00fado necess\u00e1rio para simular o problema.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo 'CREATE TABLE <code>usuario<\/code> (\\\\n <code>id<\/code> BIGINT(20) NOT NULL AUTO_INCREMENT,\\\\n <code>nome<\/code> VARCHAR(255) NOT NULL,\\\\n <code>login<\/code> VARCHAR(50) NOT NULL,\\\\n <code>email<\/code> VARCHAR(255) NOT NULL,\\\\n <code>senha<\/code> VARCHAR(50) NOT NULL,\\\\n <code>telefone_fixo<\/code> VARCHAR(50) DEFAULT NULL,\\\\n <code>telefone_celular<\/code> VARCHAR(50) DEFAULT NULL,\\\\n <code>timezone<\/code> VARCHAR(100) DEFAULT NULL,\\\\n <code>ativo<\/code> TINYINT(3) UNSIGNED NOT NULL,\\\\n <code>created_at<\/code> DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),\\\\n <code>updated_at<\/code> DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),\\\\n PRIMARY KEY (<code>id<\/code>),\\\\n UNIQUE KEY <code>ixu_login<\/code> (<code>login<\/code>),\\\\n KEY <code>idx_usuario_created_at<\/code> (<code>created_at<\/code>),\\\\n KEY <code>idx_usuario_updated_at<\/code> (<code>updated_at<\/code>)\\\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;' &gt; linefeed.sql<\/pre>\n\n\n\n<p>Listando e conferindo que temos apenas uma \u00fanica linha no arquivo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat linefeed.sql<\/code><\/pre>\n\n\n\n<p>Para os amantes do editor vi podemos fazer essa mesma substitui\u00e7\u00e3o com a seguinte sequ\u00eancia de comandos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vi linefeed.sql\n:1,$ s\/\\\\n\/\\r\/g &lt;enter&gt;\n:wq<\/code><\/pre>\n\n\n\n<p>Observe que neste comando o conte\u00fado a ser aplicado deve ser <strong>\\r<\/strong> e n\u00e3o <strong>\\n<\/strong><\/p>\n\n\n\n<p>\u00c9 claro que voc\u00ea poderia se livrar de toda essa parafern\u00e1lia 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.<\/p>\n\n\n\n<p>Mas fica aqui a minha pergunta. Por que voc\u00ea iria querer isto?<\/p>\n\n\n\n<p>Thanks for watching!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje novamente me deparei com um bloco de texto de linha \u00fanica, ou seja as quebras de linha foram geradas como string texto \\n e n\u00e3o como o caracter linefeed ou carriage return como eu esperava. Bom, n\u00e3o importa, isso acontece eventualmente ent\u00e3o fazer a substitui\u00e7\u00e3o manual via comando sed \u00e9 a forma mais r\u00e1pida [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[200,201,199,194,202,203,198,197,195,186,196],"class_list":["post-435","post","type-post","status-publish","format-standard","hentry","category-shell-script","tag-n","tag-r","tag-carriage-return","tag-command-line","tag-cr","tag-lf","tag-linefeed","tag-replace","tag-sed","tag-shell","tag-vi"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=435"}],"version-history":[{"count":3,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/435\/revisions"}],"predecessor-version":[{"id":440,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/435\/revisions\/440"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}