Qual è il modo migliore per convertire i CRLF in feed di riga in file su Linux?
Ho visto i comandi sed , ma c'è qualcosa di più semplice?
Qual è il modo migliore per convertire i CRLF in feed di riga in file su Linux?
Ho visto i comandi sed , ma c'è qualcosa di più semplice?
Risposte:
Usa questo comando:
fromdos yourtextfile
Viceversa:
todos yourtextfile
Questi comandi si trovano nel pacchetto tofrodos (sulle distribuzioni più recenti), che fornisce anche i due wrapper unix2dos e dos2unix che imitano i vecchi strumenti unix con lo stesso nome.
find . -name '*.txt' -print0 | xargs -null fromdos
Usa dos2unix
.
dos2unix - Convertitore formato file di testo da DOS / MAC a UNIX
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Preferisco il perl :
perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
Ma è adatto ai miei usi ed è molto facile per me ricordare. Non tutti i sistemi hanno un comando dos2unix, ma la maggior parte su cui lavoro ha un interprete perl.
Un altro è recode , un potente sostituto di dos2unix e iconv; è disponibile nel pacchetto "recode" nei repository Debian:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
Per i fan di Awk :
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
... e sed :
sed 's/\r$//' winfile.txt > unixfile.txt
E ora, solo leggermente meno contorto rispetto all'eliminazione manuale dei CR in un editor esadecimale, direttamente da uno dei nostri amici stackoverflow.com, utilizzabile con l' interprete di manzo (che si trova nel tuo repository Debian di vicinato),
dos2unix in brainfuck !
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
grazie mille a jk per aver perso un'ora della sua vita a scrivere questo!
Faccio questo su Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
Penso che puoi anche usare tr
(anche se non ho file di formato divertenti su cui provare):
tr -d '\r' < file1 > file2
Ho trovato un modo molto semplice ... Apri il file con nano: ## nano file.txt
premi Ctrl + O per salvare, ma prima di premere Invio premi: Alt + D per alternare le terminazioni di riga DOS e Unix / Linux, oppure: Alt + M per alternare tra le terminazioni di Mac e Unix / Linux quindi premi Invio per salvare e Ctrl + X per uscire.
Alt+d
. A volte alt viene intercettato dal programma terminale, quindi è possibile utilizzare esc+d
invece.
Se vuoi un metodo GUI, prova l' editor di testo Kate (anche altri editor di testo avanzati potrebbero essere in grado di gestirlo). Apri la finestra di dialogo Trova / Sostituisci ( Ctrl+ R) e sostituisci \r\n
con \n
. (NB: dovrai selezionare "Espressione regolare" dal menu a discesa e deselezionare "Solo selezione" dalle opzioni.)
EDIT: O, se si vuole semplicemente convertire in formato Unix, quindi utilizzare l'opzione di menu Tools
> End of Line
> Unix
.
\r\n
in modo specifico, \n
usare la ricerca / sostituzione è più facile che ricordare quale sistema operativo utilizza quale fine riga. ;)
Incollalo nello script Python dos2unix.py .
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Dovrebbe funzionare su qualsiasi piattaforma con Python installato. Dominio pubblico.
CR LF
a LF
utilizzare awk :
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
Esempio di utilizzo:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
Spiegazione:
-v RS='\r?\n'
imposta la variabile RS ( input r ecord s eparator) su \r?\n
, il che significa che l'input viene letto riga per riga separata da LF ( \n
) che può ( ?
) essere preceduta da CR ( \r
).
1
è lo script eseguito da awk. Una sceneggiatura è composta da condition { action }
. In questo caso, 1
è la condizione che viene valutata vera. L'azione viene omessa, quindi viene eseguita l'azione predefinita, il che significa stampare la riga corrente (che potrebbe anche essere scritta come {print $0}
o semplicemente {print}
).
LF
a CR LF
: È possibile impostare la variabile ORS
( o utput r ecord s eparator) per modificare le estremità della linea dell'output. Esempio:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Ho usato questo script per i file necessari per trasferire i file di emergenza da un sistema Windows a un sistema unix.
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
Trova tutti i file, ricorsivamente nella directory da cui stai eseguendo il comando
xargs file
Passalo al programma di file per ottenere un'analisi del file.
grep CRLF
Vogliamo solo l'output del file che mostra CRLF.
cut -d: -f1
Ottieni l'output fino al colore. scartare il resto. Dovremmo avere solo un nome file ora
xargs dos2unix