Conserva le terminazioni di riga


111

Ho eseguito sed per eseguire alcune sostituzioni su Windows e ho notato che converte automaticamente le terminazioni di riga in Unix (\ n). Esiste un'opzione per dire a sed di utilizzare le terminazioni di riga di Windows (\ r \ n) o anche meglio per preservare le terminazioni di riga dal file?

Nota: utilizzo sed da unxutils: http://unxutils.sourceforge.net/


2
Le soluzioni seguenti non funzionano su macOS.
William Entriken

Sono persino arrivato a questo punto e ancora non ha funzionatoLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken

Quindi in realtà il comando sopra funziona e ho appena scoperto un bug nel git diffprogramma.
William Entriken

1
Puoi usare sed (senza opzioni speciali) + unix2dos
mems

Risposte:


143

Puoi usare l' -bopzione per sed in modo che tratti il ​​file come binario. Questo risolverà il problema con sed di cygwin su Windows.

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

Se desideri abbinare la fine della riga, ricordati di abbinare, catturare e copiare il ritorno a capo opzionale.

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

Dalla pagina man di sed :

-b --binary

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


5
Nota che questo non funziona con sed -icygwin (per me), ma puoi aggirare questo problema . Grazie per l'aggiornamento: le altre risposte sono state l'ultima parola su questo argomento per un po '.
arpione

Nota, questa opzione non è disponibile con sed su Mac.
Senthil Kumaran

21
Per me funziona anche con sed -i: è importante solo come scriverlo. Mentre sed -bie sed -i -bil lavoro, sed -iblo fa senza lavoro: vedere la pagina man per il motivo per cui (utilizza il bcome il suffisso per la copia di backup).
Olaf Mandel

2
Usa:sed -bi 's/foo/bar/'
Kunal B.

2
Non funziona per me in Windows cygwin. Sulle righe che sed ha apportato la modifica, la fine della riga è Unixy. Il resto delle righe ha terminazioni di riga Windowish. Quindi il mio file ha un misto di righe con diverse terminazioni di riga.
truthadjustr

10

Potresti provare a sostituire il \nfor \r\nalla 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 nessuna delle due precedenti funziona, dovrai consultare la pagina man specifica per la tua versione di sedper vedere se tale opzione esiste. Nota che le versioni * nix di sednon senza alterare i terminatori di linea senza che venga detto di farlo.

Un'altra alternativa è usare la cygwinversione della sedquale non dovrebbe avere questo comportamento indesiderato.


15
La versione cygwin ha questo comportamento indesiderato.
arpione

2
Se il file contiene sia \ n ( 0x0A) che \ r \ n ( 0x0D 0x0A), questa soluzione proposta (di reiniettare sempre il \ r) lo interrompe.
Vlad

Questo funziona per me usando MSYS2 / MinGW. Grazie @SiegeX.
AntumDeluge

6

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


sed su MacOS non ha l'opzione -b e presenta problemi simili a quelli descritti nella domanda originale. L'alternativa perl non ha questo problema, quindi grazie per il tuo suggerimento. sed -i -e 's/<img[^>]*\/>//g' *.xmlsostituisce le terminazioni di riga con "\ n" perl -i -p -e 's/<img[^>]*\/>//g' *.xmlconserva le terminazioni di riga originali
Guruniverse

2

Gnuwin può essere soppresso per rovinare le nuove righe (win-> unix) se si specifica solo l'opzione -b e il reindirizzamento. L'utilizzo dello switch -i (inline) rovinerà tutto.

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


1
Vedi una versione con -imodalità di lavoro nella mia risposta .
Vadzim

2

Ho scoperto che sed-4.4.exeda https://github.com/mbuilov/sed-windows è pura vittoria

  • utilizza le terminazioni di riga CRLF di Windows in modalità predefinita
  • conserva le terminazioni di riga originali in -bmodalità
  • funziona correttamente con la -imodalità sul posto
  • offre anche la -zmodalità con \0delimitatori invece dei \nquali può essere utile a volte anche

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

Si noti che GnuWin32 sed 4.2.1 fa fine riga corrotti in -bimodalità e non dispone di -zmodalità a tutti.

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.