Mantieni fine linea

Corro sed per fare alcune sostituzioni su Windows e ho notato che converte automaticamente le terminazioni di riga in Unix (\ n). C’è un’opzione per dire a sed di usare le terminazioni di riga di Windows (\ r \ n) o anche meglio per preservare le terminazioni di linea dal file?

Nota: io uso sed da unxutils: http://unxutils.sourceforge.net/

È ansible utilizzare l’opzione -b per sed per fare in modo che il file venga trattato come binario. Questo risolverà il problema con cygwin’s sed su Windows.

Esempio: sed -b 's/foo/bar/'

Se desideri abbinare la fine della linea, ricorda di abbinare, acquisire e copiare il ritorno a capo opzionale.

Esempio: sed -b 's/foo\(\r\?\)$/bar\1/'

Dalla pagina man di sed :

-b –binario

Questa opzione è disponibile su ogni piattaforma, ma è efficace solo quando il sistema operativo distingue tra file di testo e file binari. Quando viene fatta una tale distinzione, come nel caso di MS-DOS, Windows, i file di testo Cygwin sono composti da linee separate da un ritorno a capo e un carattere di avanzamento riga, e sed non vede il finale CR. Quando viene specificata questa opzione, sed aprirà i file di input in modalità binaria, quindi non richiederà questa elaborazione speciale e considererà le righe da terminare con un avanzamento di riga.

Potresti provare a inserire \n per \r\n alla fine del tuo script esistente in questo modo:

 sed 's/foo/bar/;s/$/\r/' 

o forse

  sed -e 's/foo/bar/' -e 's/$/\r/' 

Se nessuno dei due precedenti funziona, dovrai consultare la pagina man specifica per la tua versione di sed per vedere se esiste una tale opzione. Si noti che le versioni * nix di sed non alterano i terminatori di riga senza che gli venga detto di farlo.

Un’altra alternativa è usare la versione cygwin di sed che non dovrebbe avere questo comportamento indesiderabile.

In alternativa, (la versione cygwin di) perl -pe non sembra avere questo problema.

Gnuwin può essere soppresso per rovinare le newline (win-> unix) se si specifica solo l’opzione -b e il reindirizzamento. Usando l’opzione -i (inline) si rovinerà.

Ad esempio sed.exe -b “s / \ xFF \ xFE //” c: \ temp \ in.csv> c: \ temp \ out.csv

Ho trovato che sed-4.4.exe da https://github.com/mbuilov/sed-windows è pura vittoria in quanto

  • utilizza le terminazioni di riga CRLF di Windows nella modalità predefinita
  • conserva le terminazioni di linea originali in modalità -b
  • funziona correttamente con la modalità -i in-place
  • offre anche la modalità -z con delimitatori \0 invece di \n che a volte può essere utile

Vedi anche l’ elenco delle opzioni sed e l’ elenco di tutte le porte sed Windows .

Notare che gnuwin32 sed 4.2.1 ha terminazioni di riga corrotte in modalità -bi e non ha affatto la modalità -z .