Frage

Was ist der einfachste Weg, um alle Wagen zu entfernen \r aus einer Datei in Unix zurückkehrt?

War es hilfreich?

Lösung

Ich werde Sie kehrt meinen Wagen ( CR , "\r", 0x0d) anzunehmen, bei der beendet von Linien, anstatt nur blind innerhalb einer Datei (Sie haben können sie in der Mitte der Saiten für alle wissen, I). Mit Hilfe dieser Testdatei mit einem CR am Ende der ersten Zeile nur:

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix ist der Weg zu gehen, wenn es auf Ihrem System installiert ist:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Wenn aus irgendeinem Grunde dos2unix Sie nicht zur Verfügung steht, dann wird sed es tun:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Wenn aus irgendeinem Grund sed Ihnen nicht zur Verfügung steht, dann wird ed es tun, auf komplizierte Weise:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Wenn Sie nicht über jeden diese Tools auf Ihrem System installiert ist, haben Sie größere Probleme bekommen als zu versuchen, Dateien zu konvertieren: -)

Andere Tipps

tr -d '\r' < infile > outfile

Siehe tr (1)

Old School:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

Es gibt ein Programm namens dos2unix , die auf vielen Systemen vorhanden ist, und kann leicht installiert werden am meisten.

Der einfachste Weg, auf Linux ist, meiner bescheidenen Meinung nach,

sed -i 's/\r$//g' <filename>

starke Zitate um die Substitution Operator 's/\r//' sind wesentlich . Ohne sie wird die Shell interpretieren \r als Flucht + r und reduzieren sie auf eine Ebene r, und entfernen Sie alle Kleinbuchstaben r. Deshalb ist die oben gegebene Antwort in 2009 von Rob funktioniert nicht.

Und Zugabe des /g Modifikator sorgt dafür, dass auch mehrere \r entfernt werden, und nicht nur die erste.

sed -i s/\r// <filename>, etc. zu jagen; siehe man sed oder die Fülle von Informationen, die im Internet in Bezug auf die Verwendung von sed.

Eine Sache, darauf hinzuweisen, ist die genaue Bedeutung von „Wagenrücklauf“ in der oben; wenn Sie wirklich den einzigen Steuerzeichen „Wagenrücklauf“ bedeuten, dann über das Muster korrekt ist. Wenn Sie gemeint, allgemeiner, CRLF (Carriage Return und ein Zeilenvorschub, das ist, wie Zeilenvorschübe unter Windows implementiert werden), dann möchten Sie wahrscheinlich \r\n statt ersetzen. Bare Zeilenvorschübe (Newline) in Linux / Unix ist \n.

Wenn Sie ein Vi-Benutzer sind, können Sie die Datei öffnen und entfernen Sie den Wagenrücklauf mit:

:%s/\r//g

oder mit

:1,$ s/^M//

Beachten Sie, dass Sie ^ M durch Drücken von Strg-v geben sollen und dann Strg-m.

Noch einmal eine Lösung ... Da immer noch ein:

perl -i -pe 's/\r//' filename

Es ist schön, weil es an seinem Platz ist und funktioniert in jedem Geschmack von Unix / Linux mit denen ich gearbeitet habe.

Jemand anderes dos2unix empfehlen und ich es stark auch empfehlen. Ich bin nur wenig Angaben.

Wenn installiert, mit dem nächsten Schritt springen. Wenn nicht bereits installiert ist, würde ich empfehlen, es über yum Installation wie:

yum install dos2unix

Dann können Sie es verwenden mögen:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

Hier ist die Sache,

%0d ist das Wagenrücklaufzeichen. Um es mit Unix compatabile. Wir müssen den folgenden Befehl verwenden.

dos2unix fileName.extension fileName.extension

versuchen, diese dos zu konvertieren in Unix-Datei:

  

fromdos Datei

Wenn Sie ein Betriebssystem verwenden (wie OS X), die nicht den dos2unix Befehl hat aber einen Python-Interpreter (Version 2.5+) Dieser Befehl entspricht den dos2unix Befehl:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

Diese Griffe beiden benannten Dateien auf der Kommandozeile sowie Rohren und Umleitungen, wie dos2unix. Wenn Sie diese Zeile in Ihrer Datei ~ / .bashrc (oder gleichwertig Profildatei für andere Shells):

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... das nächste Mal einloggen Sie in (oder source ~/.bashrc in der aktuellen Sitzung ausführen) Sie in der Lage sein werden, den dos2unix Namen in der Befehlszeile in der gleichen Weise wie in den anderen Beispielen zu verwenden.

Für UNIX ... Ich habe bemerkt, dos2unix entfernt Unicode-Header meine UTF-8-Datei bilden. Unter git bash (Windows), scheint das folgende Skript gut zu funktionieren. Es verwendet sed. Beachten Sie es nur Carriage-Returns an den Enden der Linien entfernt, und bewahrt Unicode-Header.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

Wenn Sie eine X-Umgebung ausgeführt werden und haben einen richtigen Editor (Visual Studio-Code), dann würde ich die reccomendation folgen:

Visual Studio-Code: Wie zeigen Zeilenende

Gehen Sie einfach auf der rechten unteren Ecke des Bildschirms, Visual Studio-Code zeigt Ihnen sowohl die Dateicodierung und das Zeilenende-Konvention durch die Datei gefolgt, eine nur mit einem einfachen Klick Sie, dass um wechseln.

Verwenden Sie einfach visuellen Code als Ersatz für Notepad ++ auf einer Linux-Umgebung und Sie kann es los gehen.

Ich habe Python dafür verwendet, hier mein Code;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

Obwohl es ein älterer Post, die vor kurzem stieß ich auf mit dem gleichen Problem. Da ich alle Dateien hatte innen / tmp / blah_dir / umbenennen, da jede Datei in diesem Verzeichnis hatte „/ r“ trailing-Zeichen (zeigt „?“ Am Ende der Datei), so tat es Skript Weise nur könnte ich mir vorstellen.

wollte ich letzte Datei mit dem gleichen Namen speichern (ohne jedes Zeichen nachgestellt). Mit sed, war Problem der Ausgabedatei, die ich brauchte, war etwas anderes zu erwähnen (was ich nicht wollte).

Ich habe versucht, andere Optionen wie hier vorgeschlagen (nicht wegen einiger Einschränkungen betrachtet dos2unix), aber hat nicht funktioniert.

Ich habe versucht, mit "awk" schließlich, die gearbeitet, wo ich "\ r" als Trennzeichen verwendet und den ersten Teil genommen :

Trick ist:

echo ${filename}|awk -F"\r" '{print $1}'

Unter Skript Snippet I verwendet (wo ich hatte alle Datei "\ r" hatte als Hinter Zeichen an Pfad / tmp / blah_dir /) mein Problem zu beheben:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

Hinweis: Dieses Beispiel ist nicht sehr genau, obwohl nah an, was ich gearbeitet (hier nur die Erwähnung der bessere Vorstellung darüber zu geben, was ich getan habe)

Sie können dies einfach tun:

$ echo $(cat input) > output
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top