Domanda

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

Che cosa sta causando questo e come posso risolverlo?

È stato utile?

Soluzione

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

Altri suggerimenti

Correggi le terminazioni di riga in vi eseguendo quanto segue:

:set fileformat=unix

:w

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

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

dos2unix aiuterà con questo.Probabilmente dovrai anche modificare il sorgente degli script in modo che siano 'Unix-friendly'.

Il modo più semplice è usare vi. So che sembra terribile, ma è semplice e già installato sulla maggior parte degli ambienti UNIX.^M è una nuova linea dell'ambiente Windows/DOS.

dal prompt dei comandi: $ vi filename

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

Cerca e sostituisci tutto a livello globale lo è :%s/^M//g "Premere e tenere premuto il controllo, quindi premere V quindi m" che sostituirà ^M con nulla.

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

Prova a utilizzare dos2unix per rimuovere ^M.

In vi, eseguire a :%s/^M//g

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

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

perl -pie 's/\r//g' filename.txt

^M è tipicamente causato dal ritorno a capo dell'operatore Windows e tradotto in Unix appare come un ^M.Il comando dos2unix dovrebbe rimuoverli correttamente

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

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

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

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

Potresti 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.  

Per sostituire i caratteri ^M nell'editor vi utilizzare di seguito

aprire il file di testo dire t1.txt

vi t1.txt

Accedere alla modalità comando premendo shift + :

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

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

Un'alternativa a dos2unix il comando utilizzerebbe utilità standard come sed.

Ad esempio, da DOS a Unix:

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

unix da fare:

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

Puoi rimuovere ^M dai file direttamente tramite il comando sed, ad esempio:

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

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

rm -v *.bak

Converti terminazioni di riga DOS/Windows ( ) in terminazioni di riga Unix ( ), con tr:

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

Post sulla sostituzione dei caratteri di fine riga dalla riga di comando Unix

od -a $file è utile esplorare questo tipo di domande su Linux (simile a dumphex sopra).

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

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

I miei due centesimi

Un altro comando vi che farà: :%s/.$// Ciò rimuove l'ultimo carattere di ogni riga nel file.Lo svantaggio di questo comando di ricerca e sostituzione è che non gli interessa quale sia l'ultimo carattere, quindi fai attenzione a non chiamarlo due volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top