Zeilenenden beibehalten

111

Ich habe sed ausgeführt, um Windows zu ersetzen, und festgestellt, dass Zeilenenden automatisch in Unix (\ n) konvertiert werden. Gibt es eine Option, um sed anzuweisen, Windows-Zeilenenden (\ r \ n) zu verwenden, oder noch besser, die Zeilenenden aus der Datei beizubehalten?

Hinweis: Ich verwende sed von unxutils: http://unxutils.sourceforge.net/

Bogdan Calmac
quelle
2
Die folgenden Lösungen funktionieren unter macOS nicht.
William Entriken
Ich bin sogar so weit gekommen und es hat immer noch nicht funktioniertLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
William Entriken
Der obige Befehl funktioniert also tatsächlich und ich habe gerade einen Fehler im git diffProgramm entdeckt.
William Entriken
1
Sie können sed (ohne spezielle Optionen) + unix2dos
mems

Antworten:

143

Sie können die -bOption für sed verwenden, damit die Datei als binär behandelt wird. Dies wird das Problem mit Cygwins Sed unter Windows beheben.

Beispiel: sed -b 's/foo/bar/'

Wenn Sie mit dem Zeilenende übereinstimmen möchten, denken Sie daran, den optionalen Wagenrücklauf abzugleichen, zu erfassen und zu kopieren.

Beispiel: sed -b 's/foo\(\r\?\)$/bar\1/'

Von der sed man page :

-b - binär

Diese Option ist auf jeder Plattform verfügbar, jedoch nur dann wirksam, wenn das Betriebssystem zwischen Textdateien und Binärdateien unterscheidet. Wenn eine solche Unterscheidung getroffen wird - wie dies bei MS-DOS, Windows und Cygwin der Fall ist - bestehen Textdateien aus Zeilen, die durch einen Wagenrücklauf und ein Zeilenvorschubzeichen getrennt sind, und sed sieht die End-CR nicht. Wenn diese Option angegeben ist, öffnet sed Eingabedateien im Binärmodus, fordert diese spezielle Verarbeitung nicht an und berücksichtigt, dass Zeilen bei einem Zeilenvorschub enden. "

Shlomo
quelle
5
Beachten Sie, dass dies bei sed -iCygwin (für mich) nicht funktioniert , aber Sie können das umgehen. Vielen Dank für das Update - die anderen Antworten waren für eine Weile das letzte Wort zu diesem Thema.
Harpo
Beachten Sie, dass diese Option mit sed auf dem Mac nicht verfügbar ist.
Senthil Kumaran
21
Funktioniert bei mir auch mit sed -i: Es ist nur wichtig, wie man es tippt. Während sed -biund sed -i -barbeiten, sed -ibfunktioniert nicht : In der Manpage erfahren Sie, warum (verwendet das bals Suffix für die Sicherungskopie).
Olaf Mandel
2
Verwenden Sie:sed -bi 's/foo/bar/'
Kunal B.
2
Funktioniert bei mir nicht in Windows Cygwin. In den Zeilen, die die Änderung vorgenommen haben, ist das Zeilenende Unixy. Die restlichen Zeilen haben fensterische Zeilenenden. Somit hat meine Datei eine Mischung aus Zeilen mit unterschiedlichen Zeilenenden erhalten.
Truthadjustr
10

Sie können versuchen, das \nfor \r\nam Ende Ihres vorhandenen Skripts wie folgt einzureichen:

sed 's/foo/bar/;s/$/\r/'

oder vielleicht

 sed -e 's/foo/bar/' -e 's/$/\r/'

Wenn keine der beiden oben genannten Funktionen funktioniert, müssen Sie die spezifische Manpage für Ihre Version von konsultieren, um festzustellen sed, ob eine solche Option vorhanden ist. Beachten Sie, dass die * nix - Versionen sedhaben nicht die Linie Terminator ändern , ohne gesagt, dies zu tun.

Eine weitere Alternative ist es, die verwenden cygwinVersion von sedder sollte nicht dieses unerwünschte Verhalten.

SiegeX
quelle
15
Die Cygwin-Version hat dieses unerwünschte Verhalten.
Harpo
2
Wenn die Datei sowohl \ n ( 0x0A) als auch \ r \ n ( 0x0D 0x0A) enthält, wird sie durch diese vorgeschlagene Lösung (indem das \ r immer wieder neu injiziert wird) unterbrochen.
Vlad
Dies funktioniert bei mir mit MSYS2 / MinGW. Vielen Dank, dass Sie @SiegeX.
AntumDeluge
6

Alternativ perl -pescheint (die Cygwin-Version von) dieses Problem nicht zu haben.

Sucher
quelle
sed unter MacOS verfügt nicht über die Option -b und hat ähnliche Probleme wie in der ursprünglichen Frage beschrieben. Die Perl-Alternative hat dieses Problem nicht. Vielen Dank für Ihren Vorschlag. sed -i -e 's/<img[^>]*\/>//g' *.xmlersetzt Zeilenenden durch '\ n' perl -i -p -e 's/<img[^>]*\/>//g' *.xml
behält
2

Gnuwin kann unterdrückt werden, um die Zeilenumbrüche (win-> unix) durcheinander zu bringen, wenn Sie nur den Schalter -b angeben und umleiten. Die Verwendung des Schalters -i (Inline) bringt es durcheinander.

ZB sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv

Buckley
quelle
1
Eine Version mit Arbeitsmodus finden Sie -iin meiner Antwort .
Vadzim
2

Ich habe festgestellt, dass sed-4.4.exevon https://github.com/mbuilov/sed-windows reiner Gewinn ist

  • Verwendet Windows CRLF-Zeilenenden im Standardmodus
  • behält die ursprünglichen Zeilenenden im -bModus bei
  • funktioniert korrekt im In-Place- -iModus
  • bietet auch einen -zModus mit \0Begrenzern an, \nder manchmal auch praktisch sein kann

Siehe auch Liste der Sed-Optionen und Liste aller Windows-Sed-Ports .

Beachten Sie, dass gnuwin32 sed 4.2.1 macht korrupt Zeilenende in -biModus und keinen -zModus überhaupt.

Vadzim
quelle