Come aggiungere un ritorno a capo prima di ogni nuova riga?


28

Ho un file che utilizza solo \nper le nuove righe, ma ne ho bisogno \r\nper ogni nuova riga. Come posso fare questo?

Ad esempio, l'ho risolto usando Vim :%s/\n/\r\n/g, ma vorrei usare uno script o un'applicazione da riga di comando. Eventuali suggerimenti?

Ho provato a cercarlo con sedo grep, ma sono stato immediatamente confuso dalle soluzioni alternative della sequenza di escape (sono un po 'verde con questi comandi).

Se interessati, l'applicazione è correlata alla mia domanda / risposta qui

Risposte:


36

Puoi usare unix2dos (che si trova su Debian):

unix2dos file

Si noti che questa implementazione non inserire CRprima di ogni LF, solo davanti a quei LFs che non sono già preceduti da una (e una sola) CRe salta i file binari (quelli che contengono valori di byte in 0x0 -> 0x1f spaziano diverso LF, FF, TABo CR).

o utilizzare sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

o utilizzare awk:

awk '{printf "%s\r\n", $0}' file

o utilizzare perl:

perl -pe 's|\n|\r\n|' file

Si noti che unix2dox non inserirà un CRprima di ogni LF, solo prima di quei LF che non sono già preceduti da uno (e solo uno) CR.
Stéphane Chazelas

@ StéphaneChazelas: Grazie per il punto, l'ho aggiunto alla mia risposta.
cuonglm

1
Il pezzo fondamentale di informazioni per me qui stava usando '\r'con sedfa il trucco.
Rkersh,

8

Questo è esattamente ciò che unix2dosfa:

$ unix2dos file.txt

Quello sostituirà file.txtsul posto con una versione con terminazioni di linea CRLF.

Se vuoi farlo con sed, puoi inserire un ritorno a capo alla fine di ogni riga:

sed -e 's/$/\r/' file.txt

Questo sostituisce ( s) l'area di dimensione zero appena prima della fine della riga ( $) con \r. Per eseguire la sostituzione sul posto (comeunix2dos fa), utilizzare sed -i.bak, sebbene si tratti di un'estensione non standard - se non lo si possiede, utilizzare un file temporaneo.


3
L'uso \rin sostituzione non è portatile. Almeno, non funzionerà in Mac OSX.
cuonglm,

Si noti che esistono diverse implementazioni di unix2dos. Potresti voler dare un link alla home page di un'implementazione specifica (come waterlan.home.xs4all.nl/dos2unix.html come si trova su Debian) invece di linux.die.net/man che non chiarisce quale l'implementazione (o versione) è documentata. Nota che ci sono alcuni u2d, ux2dos, todoscomanda intorno pure.
Stéphane Chazelas,

2

Se stai eseguendo la conversione su una macchina Unix (OS X, Linux), apri il file con vi o vim:

$ vim my-file

premere il tasto ESC per assicurarsi di non essere in modalità inserimento, quindi digitare

:set ff=dos

o

:set fileformat=dos

Questo fa la conversione in atto impostando il formato del file.

Per scrivere il file ed uscire dall'editor utilizzare

:wq

Sulla riga di comando puoi farlo

$ vi +':w ++ff=dos' +':q' my-file

grazie per aver spiegato tutti i passaggi: per un principiante è molto più facile capire cosa sta succedendo.
user3616725

2

Farlo con POSIX è complicato:

  • POSIX Sed non supporta \ro \15. Anche se così fosse, l'opzione sul posto -inon è POSIX

  • POSIX Awk supporta \re \15, tuttavia, l' -i inplaceopzione non è POSIX

  • D2U e dos2unix non sono POSIX utilità , ma ex è

  • POSIX ex non supporta \r, \15, \no\12

Per rimuovere i ritorni a capo:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

Per aggiungere resi di trasporto:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file

1

Una funzione di shell portatile che farà questo:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Con ciò puoi fare:

u2dos file >dosfile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.