it-swarm.it

Carattere '^ M' alla fine delle linee

Quando eseguo un particolare script SQL in ambienti Unix, vedo un carattere '^ M' alla fine di ogni riga dello script SQL mentre viene ripetuto nella riga di comando. Non so su quale sistema operativo sia stato originariamente creato lo script SQL.

Cosa sta causando questo e come posso risolverlo?

97
Paul Reiners

È causato dai caratteri di fine riga DOS/Windows. Come ha detto Andy Whitfield, il comando Unix dos2unix aiuterà a risolvere il problema. Se vuoi maggiori informazioni, puoi leggere le pagine man per quel comando.

77
Thomas Owens

Correggi le terminazioni di riga in vi eseguendo quanto segue:

:set fileformat=unix

:w

74
Tim Abell

La causa è la differenza tra il modo in cui un sistema operativo basato su Windows e un sistema operativo basato su Unix memorizzano i marker di fine riga.

I sistemi operativi basati su Windows, grazie alla loro eredità DOS, memorizzano un fine riga come coppia di caratteri - 0x0D0A (ritorno a capo + avanzamento riga). I sistemi operativi basati su Unix usano solo 0x0A (a avanzamento riga ). Il ^M che stai vedendo è una rappresentazione visiva di 0x0D (a ritorno a capo ).

dos2unix ti aiuterà in questo. Probabilmente dovrai anche regolare l'origine degli script in modo che sia "compatibile con Unix".

39
ColinYounger

Il modo più semplice è usare viSo che sembra terribile ma è semplice e già installato sulla maggior parte degli ambienti UNIX. ^ M è una nuova riga dall'ambiente Windows/DOS.

dal comando Prompt: $ vi filename

Quindi premere ": "per accedere alla modalità di comando.

Cerca e sostituisci tutto a livello globale è :%s/^M//g "Premi e tieni premuto il controllo quindi premi V poi M" che sostituirà ^ M con nulla.

Quindi per scrivere ed uscire inserisci ":wq" Fatto!

24
Bernie Perez

Prova a usare dos2unix per rimuovere ^ M.

13
Andy Whitfield

In vi, fai un :%s/^M//g

Prendere il ^M tenere il CTRL tasto, premere V poi M (Entrambi tenendo premuto il tasto di controllo) e ^M apparirà. Questo troverà tutte le occorrenze e le sostituirà con nulla.

9
dogbane

Lo script SQL è stato originariamente creato su un sistema operativo Windows. I caratteri '^ M' sono il risultato di Windows e Unix che hanno idee diverse su cosa usare per un personaggio di fine linea. Puoi usare Perl dalla riga di comando per risolvere questo problema.

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

^ M è in genere causato dalle nuove righe dell'operatore di Windows e tradotto in Unix sembra un ^ M. Il comando dos2unix dovrebbe rimuoverli bene

dos2unix [opzioni] [-c convmode] [-o file ...] [-n infile outfile ...]

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

Sed è ancora più ampiamente disponibile e può fare questo tipo di cose anche se dos2unix non è installato

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

Puoi anche provare tr:

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

Ecco i risultati:

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

Per sostituire ^ M caratteri nell'editor vi usare di seguito

aprire il file di testo dire t1.txt

vi t1.txt

Accedi alla modalità di comando premendo shift + :

quindi premere i tasti come indicato %s/^M/\r/g

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

Un'alternativa al comando dos2unix Sarebbe usare utility standard come sed.

Ad esempio, dos to unix:

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

unix to dos:

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

Converti le terminazioni di riga DOS/Windows (\ r\n) in terminazioni di linea Unix (\ n), con tr:

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

Posta sulla sostituzione di nuove righe dalla riga di comando Unix

1
Mason Wright

È possibile rimuovere ^ M dai file direttamente tramite il comando sed, ad es .:

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

Se sei soddisfatto delle modifiche, rimuovi i file .bak:

rm -v *.bak
1
kenorb

In Perl, se non vuoi impostare la variabile $/e usare chomp () puoi anche fare:

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

I miei due centesimi

0
Ariel Monaco

od -a $file è utile per esplorare questi tipi di domande su Linux (simile al dumphex di cui sopra).

0
Allan Wind