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?
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?
Antworten:
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.
find . -name '*.txt' -print0 | xargs -null fromdos
Verwenden Sie dos2unix
.
dos2unix - DOS / MAC zu UNIX Textdateiformatkonverter
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
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!
Ich mache das auf Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
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.
Alt+d
. Manchmal wird alt vom Terminalprogramm abgefangen, sodass Sie esc+d
stattdessen verwenden können.
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\n
durch \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
.
\r\n
zu \n
dann suchen mit / ersetzen ist einfacher als Erinnerns , die OS verwendet , die Linie endet. ;)
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.
CR LF
um awk zu LF
benutzen :
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
).
1
ist das Skript, das awk ausführt. Ein Skript besteht aus condition { action }
. In diesem Fall 1
ist 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}
).
LF
zu 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
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 .