2009-10-05 5 views
10

Sto provando a fare l'opposto di this question, sostituendo le terminazioni di linea Unix con terminazioni di linea Windows, in modo che io possa use SQL Server bcp over samba to import the file. Ho installato sed ma non dos2unix. Ho provato a invertire gli esempi, ma senza risultato.Sostituisci n con r n nel file Unix

Ecco il comando che sto utilizzando.

sed -e 's/\n/\r\n/g' myfile 

ho eseguito questo e poi corse od -c myfile, aspettandosi di vedere \r\n dove usato esserci \n. Ma c'è ancora tutto \n. (O almeno sembrano essere. L'output di od trabocca il mio buffer dello schermo, quindi non riesco a vedere l'inizio del file).

Non sono stato in grado di capire cosa sto facendo male. Eventuali suggerimenti?

+0

Non hai un compilatore disponibile? –

+0

Che tipo di compilatore? –

+0

per vedere la parte superiore del file: od -c nomefile | meno –

risposta

11
  • Qual è il problema con ottenere dos2unix sulla macchina?
  • Qual è la piattaforma con cui si sta lavorando?
  • Avete GNU sed o regolare non GNU sed?

In Solaris, /usr/bin/sed richiede:

sed 's/$/^M/' 

dove sono entrato nel '^ M' digitando controlloVcontrolloM. Le partite '$' alla fine della riga e sostituiscono la fine della riga con il controllo-M. Puoi scrivere anche quello.

meccanismi che prevedono sed per espandere '\r' o '\\r' per controllare-M stanno per essere specifico per la piattaforma, nel migliore dei casi.

+0

Questo ha fatto il trucco. Potrei essere in grado di ottenere dos2unix lì, ma speravo di utilizzare il software esistente. Sono su AIX. Presumo che sia la versione non GNU. Ora che ne parli, ho già usato il trucco control-v control-m in vi, ci avrei pensato. Grazie. –

-1

Forse se si tenta in questo modo

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

funzionerà, dalla mia comprensione il vostro solo facendo le sostituzioni per l'uscita della console, è necessario reindirizzare output in un file, in questo caso myfile.win, allora potresti semplicemente rinominarlo in qualunque cosa tu voglia. L'intero script sarebbe (in esecuzione all'interno di una directory piena di questo tipo di file):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1. non funziona per me – Peter

+0

è una piattaforma specifica, la risposta di Jonathan Leffler è migliore – Juparave

3

non ti servono l'opzione -e.

$ corrisponde al carattere di fine riga. Questo comando sed inserirà un carattere \r prima della fine della riga:

sed 's/$/\r/' myfile 
+1

Grazie per il suggerimento, ma per qualche motivo questo si limita a r alla fine del file. –

+0

Secondo il manuale informativo di GNU sed: "Tutti gli escape qui presentati sono estensioni GNU, ad eccezione di' \ n '. ". – hlovdal

+0

Errore mio per non aver specificato l'aroma Unix. Sto usando AIX. +1 per essere il primo a sottolineare che dovrei cercare $ invece di \ n. –

13

Di fronte a questo, io uso un semplice perl one-liner:

perl -pi -e 's/\n/\r\n/' filename 

perché sed comportamento varia, e so che questo funziona.

+0

Sì, questa è la migliore opzione portatile. Le espansioni^M e le espansioni inaffidabili inserite a mano qui sopra sono degli showstoppers. –

1

Basta aggiungere un \r (aka ^M, vedere la risposta di Jonathan Leffler) davanti a \n non è sicuro perché il file potrebbe avere modalità mista EOL, così poi si rischia di finire con alcune linee becomming \r\r\n. La cosa sicura da fare è rimuovere prima tutti i caratteri '\ r' e quindi inserire (uno singolo) \r prima dello \n.

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

Aggiornamento per l'uso ^M.

0

Provare a utilizzare:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

Questo fa in modo di inserire solo \ r quando non c'è \ r prima di \ n. Questo ha funzionato per me.