Gibt es einen Bash-Befehl, um \ r \ n in \ n zu konvertieren?

24393
user25321

Gibt es einen Bash-Befehl, um \ r \ n in \ n zu konvertieren?

Wenn ich meine Skripte von Windows nach Linux hochlade, brauche ich ein solches Dienstprogramm, damit alles funktioniert.

17
`dos2unix` ist normalerweise verfügbar, andernfalls` sed -e 's / \ r $ //' ` falstro vor 13 Jahren 7
Nein, dafür gibt es keinen Bash-Befehl, aber es gibt `dos2unix`, ein Unix- / Linux-Programm, das macht, was Sie wollen. Dennis Williamson vor 13 Jahren 1
Warum verwenden Sie nicht einfach einen gesunden Texteditor, mit dem Sie beim Speichern von Dateien einen Zeilenumbruch auswählen können? vtest vor 13 Jahren 1

9 Antworten auf die Frage

24
RaYell

Es gibt:

dos2unix 
Dies ist die historisch korrekte Antwort, obwohl dos2unix heutzutage nicht immer verfügbar ist. Jared vor 9 Jahren 0
5
Steven Penny

Es gibt ein Unix-Dienstprogramm conv, das Zeilenenden konvertieren kann. Es wird oft mit Softlinks zu u2doder d2uoder unix2dosoder aufgerufen dos2unix.

Zusätzlich gibt es Dienstprogramme, die als fromdosund bezeichnet werden todos.

5
fitorec

Mit sed und ende mit .txt, .php, .js, .css:

 sed -rie 's/\r\n/\n/' \ $(find . -type f -iregex ".*\.\(txt\|php\|js\|css\)") 
4
Peter Mortensen

Translate ( tr ) ist in allen Unixen verfügbar:

tr -d '\r' # From \r\n line end (DOS/Windows), the \r will be removed so \n line end (Unix) remains. 
Hat den Nebeneffekt, dass auch andere \ r entfernt werden. Sie sind jedoch sehr ungewöhnlich. ivan_pozdeev vor 10 Jahren 1
2
Steven Penny

Mit POSIX ist das kompliziert:

  • POSIX Sed unterstützt \roder nicht \15. Auch wenn dies der Fall -iist, ist die Option In Place nicht POSIX

  • POSIX Awk unterstützt \rund \15ist jedoch -i inplacenicht POSIX

  • d2u und dos2unix sind nicht POSIX - Dienstprogramme, aber ex ist

  • POSIX ex nicht unterstützt \r, \15, \noder\12

Wagenrücklauf entfernen:

awk 'BEGIN' file 

Wagenrücklauf hinzufügen:

awk 'BEGIN' file 
1

Verwenden von man 1 ed (das Dateien vor Ort ohne vorherige Sicherung bearbeitet - im Gegensatz zu sed .. -i ".bak" ...):

ed -s file <<< $'H\ng/\r*$/s///\nwq' 
Ich wusste es nicht einmal, aber es macht den Job (alt, aber Gold) dwana vor 8 Jahren 0
0
Justin Ethier

Ja, verwenden dos2unix. Zum Beispiel:

[justin@mybox ~]$ dos2unix myfile 
0

$ recode dos .. FILE
$ flip -u DATEI

(Jeder ist auch für Nicht-Ubuntu-Systeme verfügbar, aber diese Links sind praktisch.)

-1
Aaron Harun

Sie können dies verwenden, um alle Zeilen in mehreren Dateien, die auf .html. Sie können dies ändern, um mit einem neuen Namen übereinzustimmen.

find -iname "*.html" -exec sh -cC ' sed 's/\r\n/\n/' "$1" > "$1" ' {} {} \; 
Das ist nicht sicher! Erstens setzt die Ausgabeumleitung die Dateien im Allgemeinen auf Null, bevor `sed` ihren Inhalt lesen kann (wenn dies bei` sed` der Fall ist, verwenden Sie `-i` anstelle von Shell-Weiterleitung, um das Problem zu lösen). Zweitens entfernt dieser `sed'-Befehl das letzte Zeichen jeder Zeile, unabhängig davon, ob es sich um ein \ r \ r \ nReihe oder nicht - führen Sie es in einer Datei aus, die nicht im DOS-Format ist, und löscht einen Teil des Inhalts der Dateien. Gordon Davisson vor 13 Jahren 9