'^M' caractere no final das linhas
-
09-06-2019 - |
Pergunta
Quando eu executar um determinado script SQL em ambientes Unix, estou estou vendo uma '^M' personagem no final de cada linha do script SQL como ele é enviado para a linha de comando.Eu não sei em qual sistema operacional o script SQL que foi originalmente criado.
O que está causando isso e como faço para corrigir isso?
Solução
Ela é causada pelo DOS/Windows linha de caracteres de final.Como Andy Whitfield disse, Unix, o comando dos2unix vai ajudar a resolver o problema.Se você desejar mais informações, você pode ler as páginas de manual para o comando.
Outras dicas
Correcção terminações de linha em vi
executando o seguinte:
:set fileformat=unix
:w
A causa é a diferença entre um baseado no Windows com base SO e um Unix com OS armazenar o fim-de-linha de marcadores.
Sistemas operacionais baseados no Windows, graças à DOS herança, armazenamento de um fim-de-linha, como um par de caracteres - 0x0D0A
(+retorno de carro e avanço de linha).Sistemas operacionais baseados em Unix é só usar 0x0A
(um alimentação de linha).O ^M
você está vendo é uma representação visual de 0x0D
(um retorno de carro).
dos2unix vai ajudar com isso.Você provavelmente também precisará ajustar a fonte dos scripts para ser "Unix-friendly".
A maneira mais fácil é usar vi
. Eu sei que soa terrível, mas a sua simples e já está instalado na maioria dos ambientes UNIX.O ^M é uma nova linha a partir do Windows/DOS meio-ambiente.
a partir do prompt de comando: $ vi filename
Em seguida, pressione ":
"para chegar ao modo de comando.
Procurar e Substituir tudo no mundo é :%s/^M//g
"Pressione e mantenha pressionada a tecla control, em seguida, prima V, em seguida,
M"que substituirá ^M com nada.
Em seguida, a escrever e sair enter ":wq
"Feito!
Tente usar dos2unix tira o ^M.
No vi, fazer um :%s/^M//g
Para obter o ^M
mantenha o CTRL tecla, pressione V em seguida, M (Os dois ao mesmo tempo mantendo a tecla control) e o ^M
irá aparecer.Isto irá encontrar todas as ocorrências e substituí-los com nada.
O script SQL foi criado originalmente em um sistema operacional Windows.O '^M' personagens são um resultado do Windows e do Unix ter idéias diferentes sobre o que usar para um fim-de-linha de caracteres.Você pode usar o perl de linha de comando para corrigir isso.
perl -pie 's/\r//g' filename.txt
O ^M é normalmente causada pelo operador Windows quebras de linha, e traduzido para Unix parece um ^M.O comando dos2unix deve removê-los muito bem
dos2unix [opções] [-c convmode] [-o arquivo ...] [-n infile outfile ...]
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
O Sed é ainda mais amplamente disponível e pode fazer esse tipo de coisa também se dos2unix não está 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.
Para substituir ^M caracteres no editor vi usar abaixo
abra o arquivo de texto dizer t1.txt
vi t1.txt
Introduza o modo de comando pressionando shift + :
em seguida, pressione as teclas conforme mencionado %s/^M/\r/g
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
Uma alternativa para dos2unix
comando seria utilizando o padrão de utilitários como sed
.
Por exemplo, dos para unix:
sed 's/\r$//' dos.txt > unix.txt
unix para dos:
sed 's/$/\r/' unix.txt > dos.txt
Você pode remover ^M dos arquivos diretamente através do comando sed, por exemplo:
sed -i'.bak' s/\r//g *.*
Se você está satisfeito com as alterações, remova-o .bak arquivos:
rm -v *.bak
Converter DOS/Windows ( ) terminações de linha Unix ( ) terminações de linha, com tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
Post sobre a substituição de novas linhas a partir da linha de comando do Unix
od -a $file
é útil para explorar esses tipos de pergunta no Linux (semelhante a dumphex acima).
Em Perl, se você não quiser definir o $/ variável e usar chomp() você também pode fazer:
$var =~ /\r\n//g;
Meus dois centavos
Outro comando vi que vou fazer: :%s/.$//
Isso remove o último caractere de cada linha do arquivo.A desvantagem desta pesquisa e substituir o comando é que ele não se importa que o último caractere é, então cuidado para não chamá-lo duas vezes.