Converti i CRLF in feed di riga su Linux


34

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?


4
Dupe: superuser.com/questions/38744/… . Il collegamento fornito nella risposta accettata copre le opzioni dos2unix, perl e vi tra gli altri.
nagul,

2
Questo ha già risposte migliori però (quindi se uno di questi deve essere chiuso, probabilmente dovrebbe essere quello)
Jonik

Risposte:


40

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.


2
+1 Molto più utile della risposta "Usa dos2unix" attualmente più votata.
Jonik,

1
Sì, anche io sto votando questo. Il mio era più di un suggerimento drive-by.
Ryan C. Thompson,

Darei un bonus extra se dici come renderlo ricorsivo. Attualmente funziona solo con caratteri jolly.
sorin,

2
@SorinSbarnea: qualcosa del generefind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre

@Jonik cosa lo rende "Molto più utile"? Domanda seria
andrewtweber

24

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]

2
e unix2dos per il contrario.
Quack Quixote,

Quack, mi stai seguendo? Non che non lo apprezzi, con tutti i voti.
Ryan C. Thompson,

1
amico, sono ~ ciarlatano. pronunciare "~" come "non". :) ma no, non ti seguo, anche se mi sembra di incontrarti spesso.
Quack Quixote,

1
Prendi in considerazione l'idea di come ottenere questa utility per il tuo sistema Linux. Almeno su Ubuntu non è installato di default (ma installando il pacchetto tofrodos ottieni qualcosa di molto simile: pacchetti.ubuntu.com/jaunty/tofrodos ).
Jonik,

20

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!


1
(uso inutile di cat e) perl è complicato come sed ... quindi non stai davvero rispondendo alla domanda ma piuttosto raccogliendo reputazione :)
Akira,

2
"modo migliore" è soggettivo. questo funziona meglio per me (sono molto più a mio agio con il perl che con sed). non avevo promesso che avrebbe funzionato meglio per te.
Quack Quixote,

@akira: una domanda può avere più risposte valide. Uso questo metodo anche, occasionalmente, principalmente in combinazione con altre modifiche, quindi è sicuramente una risposta valida; ma "usa dos2unix" è sicuramente la risposta più pratica nella maggior parte delle situazioni. Quindi penso che le valutazioni vadano bene.
reinierpost,

@akira: se lo trovi più semplice, ti preghiamo di pubblicarlo come risposta e illuminare il resto di noi.
Quack Quixote,

@ ~ ciarlatano: questo è il punto: non è più semplice. è lo stesso per la tua risposta al perl. u2d o fromdos / todos sono le risposte giuste perché sono più semplici di qualsiasi altra cosa espressa in qualsiasi altro linguaggio di programmazione.
Akira,

9

Faccio questo su Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file

simpatico. ho visto un'altra menzione di tr prima di oggi. non è un programma che viene menzionato molto spesso, vero?
Quack Quixote,

7

Penso che puoi anche usare tr(anche se non ho file di formato divertenti su cui provare):

tr -d '\r' < file1 > file2


4

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.


1
Potresti modificare la tua risposta per chiarire quali impostazioni di attivazione / disattivazione replicheranno il comportamento richiesto dall'OP?
Burgi

L'OP vuole disattivare le terminazioni di linea DOS, quindi Alt+d. A volte alt viene intercettato dal programma terminale, quindi è possibile utilizzare esc+dinvece.
spinup

1
Molte nano scorciatoie funzionano anche con Shift premuto, il che spesso impedisce l'intercettazione del terminale, quindi funziona anche 'Alt-Shift-D'.
mwfearnley,

3

Preferisco Vim e :set fileformat=unix. Sebbene non sia il più veloce, mi dà un'anteprima. È particolarmente utile nel caso di un file con finali misti.


1

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\ncon \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.


Esistono editor di testo, come jEdit, che possono eseguire automaticamente queste trasformazioni: basta dirlo se si desidera separatori di linea Unix, Windows o Mac.
Jonik,

In realtà, anche KATE può farlo attraverso il menu Strumenti> Fine linea . Forse avrei dovuto pensare più lateralmente che rispondere alla domanda esattamente come era formulata, ma se sai che vuoi convertirti \r\nin modo specifico, \nusare la ricerca / sostituzione è più facile che ricordare quale sistema operativo utilizza quale fine riga. ;)
DisgruntledGoat

1

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.


1

CR LFa LFutilizzare 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}).


LFa 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

0

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

Passa il nome file al programma dos2unix usando xargs .

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.