comando SED dando retorno de carro

0

Eu tenho um problema com um comando SED Eu preciso substituir o caractere @ com uma string e anexar uma string a uma coluna em um arquivo csv

Então

[email protected] 

se tornaria

[email protected]

Estou usando o seguinte comando sed

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/[email protected]/' Test.csv

Mas eu tenho uma nova quebra de linha em algum lugar no comando assim

foo_X_exxample.com
@newdomain.com

Alguém pode informar onde está o erro no meu comando SED?

    
por B Farrell 20.10.2017 / 21:48

1 resposta

1

Parece que o arquivo original test.csv é formatado no Windows, com retorno ( 0x0d ou \r ) e alimentação de linha ( 0x0a ou \n ) para cada nova linha. Seu padrão de pesquisa sed não exclui \r , portanto, isso será retido no segundo campo correspondente e será emitido antes do texto anexado.

Então, seu comando original:

sed -i .bak -E 's/([^,\n\“]*)@([^,\n\“]*)/[email protected]/' Test.csv

fornece o arquivo de saída (usando od -c para ver os caracteres de controle):

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m  \r   @   n   e   w   d   o   m   a   i   n   .   c   o   m
0000040  \n

Se você adicionar \r aos caracteres excluídos:

sed -i .bak -E 's/([^,\r\n\“]*)@([^,\r\n\“]*)/[email protected]/' Test.csv

a sequência original de nova linha é mantida:

0000000   f   o   o   _   X   _   e   x   a   m   p   l   e   .   c   o
0000020   m   @   n   e   w   d   o   m   a   i   n   .   c   o   m  \r
0000040  \n

Observe que você não precisa de \r ou \n no primeiro campo correspondente, pois essa forma de comando sed corresponderá apenas a linhas únicas e não a novas linhas.

    
por 26.10.2017 / 15:09

Tags