it-swarm-pt.tech

Caractere '^ M' no final das linhas

Quando executo um script SQL específico em ambientes Unix, vejo um caractere '^ M' no final de cada linha do script SQL, conforme ele é ecoado na linha de comando. Não sei em qual SO o script SQL foi criado originalmente.

O que está causando isso e como corrigi-lo?

96
Paul Reiners

É causado pelos caracteres de final de linha do DOS/Windows. Como Andy Whitfield disse, o comando do Unix dos2unix ajudará a corrigir o problema. Se você deseja obter mais informações, pode ler as páginas de manual desse comando.

77
Thomas Owens

Corrija as terminações de linha em vi executando o seguinte:

:set fileformat=unix

:w

74
Tim Abell

A causa é a diferença entre como um sistema operacional baseado em Windows e um sistema operacional baseado em Unix armazenam os marcadores de fim de linha.

Os sistemas operacionais baseados no Windows, graças à sua herança DOS, armazenam um final de linha como um par de caracteres - 0x0D0A (retorno de carro + avanço de linha). Os sistemas operacionais baseados em Unix usam apenas 0x0A (a avanço de linha ). O ^M que você está vendo é uma representação visual de 0x0D (um retorno de carro ).

dos2unix ajudará com isso. Você provavelmente também precisará ajustar a fonte dos scripts para ser 'amigável ao Unix'.

39
ColinYounger

A maneira mais fácil é usar viEu sei que isso soa terrível, mas é simples e já está instalado na maioria dos ambientes UNIX. O ^ M é uma nova linha do ambiente Windows/DOS.

no prompt de comando: $ vi filename

Em seguida, pressione ":" para acessar o modo de comando.

Pesquisar e substituir tudo Globalmente é :%s/^M//g "Pressione e segure o controle e pressione V e M" que substituirá ^ M por nada.

Em seguida, para escrever e sair, digite ":wq" Concluído!

24
Bernie Perez

Tente usar o dos2unix para retirar o ^ M.

13
Andy Whitfield

No vi, faça um :%s/^M//g

Para obter o ^M, mantenha pressionado o CTRL pressione o botão V então M (Enquanto pressiona a tecla Control) e o ^M aparecerão. Isso encontrará todas as ocorrências e as substituirá por nada.

9
dogbane

O script SQL foi criado originalmente em um sistema operacional Windows. Os caracteres '^ M' são o resultado do Windows e do Unix terem idéias diferentes sobre o que usar para um caractere de fim de linha. Você pode usar Perl na linha de comando para corrigir isso.

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

O ^ M é normalmente causado pelas novas linhas do operador do Windows e traduzido para o Unix parece um ^ M. O comando dos2unix deve removê-los bem

dos2unix [opções] [-c convmode] [-o arquivo ...] [-n infile outfile ...]

7
jW.
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

O Sed está ainda mais disponível e pode fazer esse tipo de coisa também se o dos2unix não estiver instalado

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Você também pode tentar tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Aqui estão os resultados:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  
5
JGurtz

Para substituir ^ M caracteres no editor vi, use abaixo

abra o arquivo de texto, diga t1.txt

vi t1.txt

Entre no modo de comando pressionando shift + :

pressione as teclas conforme mencionado %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
4
leeladharan acharya

Uma alternativa ao comando dos2unix seria usar utilitários padrão como sed.

Por exemplo, dos para unix:

sed 's/\r$//' dos.txt > unix.txt

unix para dos:

sed 's/$/\r/' unix.txt > dos.txt
3
g4th

Converta as terminações de linha DOS/Windows (\ r\n) em finais de linha Unix (\ n), com tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Publique sobre a substituição de novas linhas na linha de comando do Unix

1
Mason Wright

Você pode remover ^ M dos arquivos diretamente através do comando sed, por exemplo:

sed -i'.bak' s/\r//g *.*

Se você estiver satisfeito com as alterações, remova os arquivos .bak:

rm -v *.bak
1
kenorb

No Perl, se você não deseja definir a variável $/e usar chomp (), também pode:

$var =~ /\r\n//g;

Meus dois centavos

0
Ariel Monaco

od -a $file é útil para explorar esses tipos de pergunta no Linux (semelhante ao dumphex acima).

0
Allan Wind