Konvertieren Sie CRLFs in Zeilenvorschübe unter Linux

34

Was ist der beste Weg, um CRLFs in Zeilenvorschübe in Dateien unter Linux zu konvertieren ?

Ich habe sed- Befehle gesehen, aber gibt es etwas Einfacheres?

JoelFan
quelle
4
Dupe: superuser.com/questions/38744/… . Der in der akzeptierten Antwort angegebene Link deckt unter anderem die Optionen dos2unix, perl und vi ab.
Nagul
2
Dies hat jedoch bereits bessere Antworten (wenn also eine davon geschlossen werden soll, sollte es wahrscheinlich diese sein)
Jonik

Antworten:

40

Verwenden Sie diesen Befehl:

fromdos yourtextfile

Umgekehrt:

todos yourtextfile

Diese Befehle befinden sich im Paket tofrodos (auf den neuesten Distributionen), das auch die beiden Wrapper unix2dos und dos2unix enthält , die die alten Unix-Tools mit demselben Namen imitieren.

avelldiroll
quelle
2
+1 Viel nützlicher als die aktuell am häufigsten gewählte Antwort "Use dos2unix".
Jonik
1
Ja, sogar ich stimme dafür. Meins war eher ein Drive-by-Vorschlag.
Ryan C. Thompson
Ich würde einen zusätzlichen Bonus geben, wenn Sie sagen, wie man es rekursiv macht. Funktioniert derzeit nur mit Wildcards.
Sorin
2
@ SorinSbarnea: so etwas wiefind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@ Jonik was macht es "viel nützlicher"? Ernste Frage
Andrewtweber
24

Verwenden Sie dos2unix.

dos2unix - DOS / MAC zu UNIX Textdateiformatkonverter

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Ryan C. Thompson
quelle
2
und unix2dos für den umgekehrten Fall.
Quack Quijote
Quack, folgst du mir? Nicht, dass ich es nicht schätze, mit all den positiven Stimmen.
Ryan C. Thompson
1
Alter, ich bin Quacksalber. sprechen Sie "~" als "nicht" aus. :) aber nein, ich folge dir nicht, aber ich scheine dich häufig zu treffen.
Quack Quijote
1
Überlegen Sie, wie Sie dieses Dienstprogramm für Ihr Linux-System erhalten. Zumindest unter Ubuntu ist es nicht standardmäßig installiert (aber wenn Sie das tofrodos-Paket installieren, erhalten Sie etwas sehr Ähnliches: packages.ubuntu.com/jaunty/tofrodos ).
Jonik
20

Ich bevorzuge perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

Aber das ist gut für meine Zwecke geeignet, und ich kann mich sehr leicht daran erinnern. Nicht alle Systeme haben einen dos2unix-Befehl, aber die meisten, an denen ich arbeite, haben einen Perl-Interpreter.

Ein weiterer Grund ist recode , ein leistungsstarker Ersatz für dos2unix und iconv. es ist im "recode" -Paket in Debian-Repositories verfügbar:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

Für awk Fans:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

... und sed :

sed 's/\r$//' winfile.txt > unixfile.txt

Und jetzt, nur etwas weniger kompliziert als das Löschen der CRs von Hand in einem Hex-Editor, direkt von einem unserer stackoverflow.com-Freunde , verwendbar mit dem Beef- Interpreter (in Ihrem Debian-Repository in der Nachbarschaft).

dos2unix in brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

Ein großes Dankeschön an jk, dass er eine Stunde seines Lebens damit verschwendet hat, dies zu schreiben!

Quacksalber
quelle
1
(nutzloser Gebrauch von cat und) perl ist so kompliziert wie sed ... also antwortest du nicht wirklich auf die Frage, sondern
sammelst
2
"bester Weg" ist subjektiv. Das funktioniert am besten für mich (ich fühle mich mit Perl viel wohler als mit Sed). Ich habe nicht versprochen, dass es für Sie am besten funktionieren würde.
Quack Quijote
@akira: Eine Frage kann mehrere gültige Antworten haben. Ich benutze diese Methode auch gelegentlich, meistens in Kombination mit anderen Änderungen, so dass es definitiv eine gültige Antwort ist; Aber "use dos2unix" ist in den meisten Situationen definitiv die praktischere Antwort. Ich denke, die Bewertungen sind in Ordnung.
Reinierpost
@akira: Wenn du es einfacher findest, poste es bitte als Antwort und kläre den Rest von uns auf.
Quack Quijote
@ ~ quack: das ist der punkt: einfacher geht es nicht. das gilt auch für deine perl antwort. u2d oder fromdos / todos sind die richtigen Antworten, da sie einfacher sind als alles, was in einer anderen Programmiersprache ausgedrückt wird.
Akira
9

Ich mache das auf Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
quelle
nett. Ich habe heute eine weitere Erwähnung von tr gesehen. Es ist kein Programm, das sehr oft erwähnt wird, oder?
Quack Quijote
7

Ich denke, Sie können auch Folgendes verwenden tr(obwohl ich keine lustigen Formatdateien zum Ausprobieren habe):

tr -d '\r' < file1 > file2
Labyrinth
quelle
4

In vi oder Vim :

:%s/^V^M//g
fpmurphy
quelle
4

Ich habe einen sehr einfachen Weg gefunden ... Datei mit nano öffnen: ## nano file.txt

Drücken Sie zum Speichern Strg + O, aber bevor Sie die Eingabetaste drücken, drücken Sie: Alt + D, um zwischen DOS- und Unix / Linux-Zeilenenden umzuschalten, oder: Alt + M, um zwischen Mac- und Unix / Linux-Zeilenenden umzuschalten, und drücken Sie dann die Eingabetaste, um zu speichern und Strg + X zum Beenden.

Stefan Sjöberg
quelle
1
Könnten Sie Ihre Antwort bearbeiten, um zu klären, mit welchen Umschalt-Einstellungen das vom OP angeforderte Verhalten reproduziert wird?
Burgi
Das OP will also DOS-Zeilenenden ausschaltenAlt+d . Manchmal wird alt vom Terminalprogramm abgefangen, sodass Sie esc+dstattdessen verwenden können.
Spinup
1
Viele Nano-Shortcuts funktionieren auch mit gedrückter Umschalttaste, wodurch das Abhören von Terminals häufig verhindert wird. Daher funktioniert auch 'Alt-Umschalt-D'.
Mwfearnley
3

Ich bevorzuge Vim und :set fileformat=unix. Obwohl es nicht das schnellste ist, gibt es mir eine Vorschau. Dies ist besonders nützlich bei Dateien mit gemischten Endungen.

Opello
quelle
1

Wenn Sie eine GUI-Methode wünschen, probieren Sie den Kate- Texteditor aus (andere erweiterte Texteditoren können dies möglicherweise ebenfalls verarbeiten). Öffnen Sie das Dialogfeld Suchen / Ersetzen ( Ctrl+ R) und ersetzen Sie \r\ndurch \n. (Hinweis: Wählen Sie "Regulärer Ausdruck" aus der Dropdown-Liste und deaktivieren Sie "Nur Auswahl" aus den Optionen.)

EDIT: Oder, wenn Sie einfach auf Unix - Format konvertieren wollen, dann die Menüoption Tools> End of Line> Unix.

Verärgerte Ziege
quelle
Es gibt Texteditoren wie jEdit, die diese Transformationen automatisch durchführen können. Sie müssen nur angeben, ob Sie Zeilenumbrüche für Unix, Windows oder Mac wünschen.
Jonik
Tatsächlich kann KATE dies auch über das Menü Tools> End of Line tun . Vielleicht sollte ich die Frage dachte mehr seitlich haben genau als beantworten , wie es formuliert wurde - aber wenn Sie genau wissen , konvertieren möchten Sie \r\nzu \ndann suchen mit / ersetzen ist einfacher als Erinnerns , die OS verwendet , die Linie endet. ;)
DisgruntledGoat
1

Fügen Sie dies in das Python-Skript dos2unix.py ein .

#!/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))

Sollte auf jeder Plattform funktionieren, auf der Python installiert ist. Public Domain.

anatoly techtonik
quelle
1

CR LFum awk zu LFbenutzen :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Anwendungsbeispiel:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Erläuterung:

-v RS='\r?\n'setzt die Variable RS ( Eingang r ECORD s eparator) an \r?\n, wird Bedeutung Eingang zeilenweise gelesen von LF getrennt ( \n) , die (möglicherweise ?durch CR (vorgeschaltet ) werden \r).

1ist das Skript, das awk ausführt. Ein Skript besteht aus condition { action }. In diesem Fall 1ist die Bedingung, die als wahr ausgewertet wird. Die Aktion wird weggelassen, sodass die Standardaktion ausgeführt wird. Dies bedeutet , dass die aktuelle Zeile gedruckt wird (die auch als {print $0}oder einfach geschrieben werden kann {print}).


LFzu CR LF: Sie können die Variable ORS( o utput r ECORD s eparator) , um die Leitungsenden der Ausgabe zu ändern. Beispiel:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Martin
quelle
0

Ich habe dieses Skript für Dateien verwendet, die ich für die Notfallübertragung von Dateien von einem Windows-System auf ein Unix-System benötigte.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Findet alle Dateien rekursiv in dem Verzeichnis, in dem Sie den Befehl ausführen

xargs file

Übergeben Sie es an das Dateiprogramm , um eine Analyse der Datei zu erhalten.

grep CRLF

Wir wollen nur die Ausgabe einer Datei , die CRLF anzeigt.

cut -d: -f1

Bringen Sie die Ausgabe auf die Farbe. den Rest wegwerfen. Wir sollten jetzt nur einen Dateinamen haben

xargs dos2unix

Übergeben Sie den Dateinamen mit xargs an das Programm dos2unix .

Tschallacka
quelle