Rimuovi il ritorno a capo in Unix

Qual è il modo più semplice per rimuovere tutti i ritorni a \r da un file in Unix?

Presumo che tu intenda i ritorni a 0x0d ( CR , "\r" , 0x0d ) all’estremità delle righe anziché solo ciecamente all’interno di un file (potresti averli nel mezzo di stringhe per tutto quello che so). Usando questo file di test con un CR solo alla fine della prima riga:

 $ cat infile hello goodbye $ cat infile | od -c 0000000 hello \r \ngoodbye \n 0000017 

dos2unix è la strada da percorrere se è installato sul tuo sistema:

 $ cat infile | dos2unix -U | od -c 0000000 hello \ngoodbye \n 0000016 

Se per qualche ragione dos2unix non è disponibile per te, sed lo farà:

 $ cat infile | sed 's/\r$//' | od -c 0000000 hello \ngoodbye \n 0000016 

Se per qualche motivo sed non è disponibile per te, allora ed lo farà, in un modo complicato:

 $ echo ',s/\r\n/\n/ > w !cat > Q' | ed infile 2>/dev/null | od -c 0000000 hello \ngoodbye \n 0000016 

Se non hai nessuno di questi strumenti installati sulla tua scatola, hai problemi più grandi di quanto non provi a convertire i file 🙂

 tr -d '\r' < infile > outfile 

Vedi tr (1)

Vecchia scuola:

 tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns 

C’è una utility chiamata dos2unix che esiste su molti sistemi e può essere facilmente installata sulla maggior parte.

Il modo più semplice su Linux è imho

  sed -i 's/\r//g'  

Le virgolette sull’operatore di sostituzione 's/\r//' sono essenziali . Senza di loro la shell interpreterà \r come escape + r e la ridurrà a una semplice r , e rimuoverà tutti i casi inferiori r . Ecco perché la risposta data sopra nel 2009 da Rob non funziona.

E l’aggiunta del modificatore /g garantisce che verranno rimossi anche più \r , e non solo il primo.

sed -is/\r// o somesuch; vedere l’ man sed o la ricchezza di informazioni disponibili sul web per quanto riguarda l’uso di sed .

Una cosa da sottolineare è il significato preciso di “ritorno a capo” di cui sopra; se si intende veramente il carattere di controllo singolo “carriage return”, allora il pattern sopra è corretto. Se intendevi, più in generale, CRLF (ritorno a capo e un avanzamento di riga, che è il modo in cui i feed di riga sono implementati in Windows), allora probabilmente vuoi sostituire \r\n . I feed a riga nuda (newline) in Linux / Unix sono \n .

Ancora una soluzione … Perché ce n’è sempre un’altra:

 perl -i -pe 's/\r//' filename 

È bello perché è a posto e funziona con tutti i gusti di unix / linux con cui ho lavorato.

Se sei un utente di Vi, puoi aprire il file e rimuovere il ritorno a capo con:

 :%s/\r//g 

o con

 :1,$ s/^M// 

Nota che devi digitare ^ M premendo ctrl-v e poi ctrl-m.

Qualcun altro consiglia dos2unix e lo consiglio vivamente. Sto solo fornendo maggiori dettagli.

Se installato, passa al passaggio successivo. Se non è già installato, ti consiglio di installarlo via yum come:

 yum install dos2unix 

Quindi puoi usarlo come:

 dos2unix fileIWantToRemoveWindowsReturnsFrom.txt 

Ecco la cosa,

%0d è il carattere di ritorno a capo. Per renderlo compatibile con Unix. Dobbiamo usare il comando seguente.

dos2unix fileName.extension fileName.extension

prova questo per convertire il file dos in unix file:

fromdos file

Se stai usando un SO (come OS X) che non ha il comando dos2unix ma ha un interprete Python (versione 2.5+), questo comando è equivalente al comando dos2unix :

 python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))" 

Gestisce sia i file con nome sulla riga di comando sia i pipe e i reindirizzamenti, proprio come dos2unix . Se aggiungi questa linea al tuo file ~ / .bashrc (o file profilo equivalente per altre shell):

 alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\"" 

… la prossima volta che dos2unix il login (o esegui source ~/.bashrc nella sessione corrente) sarai in grado di usare il nome dos2unix sulla riga di comando nello stesso modo degli altri esempi.

Per UNIX … ho notato che dos2unix ha rimosso le intestazioni Unicode dal mio file UTF-8. Sotto git bash (Windows), il seguente script sembra funzionare bene. Usa sed. Nota che rimuove solo i ritorni a capo alla fine delle righe e conserva le intestazioni Unicode.

 #!/bin/bash inOutFile="$1" backupFile="${inOutFile}~" mv --verbose "$inOutFile" "$backupFile" sed -e 's/\015$//g' <"$backupFile" >"$inOutFile" 

Se stai usando un ambiente X e hai un editor appropriato (codice di Visual Studio), allora seguirò la raccomandazione:

Codice di Visual Studio: come mostrare le terminazioni di riga

Basta andare nell’angolo in basso a destra dello schermo, il codice dello studio visivo mostrerà sia la codifica dei file che la convenzione di fine riga seguita dal file, e solo con un semplice click puoi cambiarlo.

Basta usare il codice visivo come rimpiazzo per notepad ++ su un ambiente Linux e si è pronti per partire.

puoi semplicemente fare questo:

 $ echo $(cat input) > output 

Ho usato Python per questo, qui il mio codice;

 end1='/home/.../file1.txt' end2='/home/.../file2.txt' with open(end1, "rb") as inf: with open(end2, "w") as fixed: for line in inf: line = line.replace("\n", "") line = line.replace("\r", "") fixed.write(line)