Thread Neue Zeile in Dateien
(23 answers)
Opened by Nina at 2005-11-14 19:23
[quote=lichtkind,16.11.2005, 10:08]wenn sie aus einem elf dump extrahiert können leicht auch mal EOL symbole mittendrin vorkommen,
[/quote] Wie das? Und wenn, wie sollte man zwischen einem "echten" und einem "zu den Daten gehoerigen" Newline unterscheiden? Quote Wenn man diesen Aufruf: Code: (dl
)
perl -pi -e 's/\n/\r\n/' datei.txt unter Unix/Linux macht, dann wird die Datei sowieso zeilenweise abgearbeitet (wegen -p), und da gibt's nicht mehr als ein Newline pro Zeile. Machte man den gleichen Aufruf unter Windows, dann wuerde die ganze Datei als eine Zeile eingelesen (weil ja nach <CR><LF> als Zeilentrenner gesucht wird) und man braeuchte einen /g-Modifier, muesste aber auch die Ersetzung aendern oder die Datei im Binaermodus bearbeiten, da sonst aus "\r\n" die Bytefolge <CR><CR><LF> wuerde. Schliesslich wird jedes Newline beim Schreiben einer Textdatei unter Win/DOS in <CR><LF> gewandelt. Tatsaechlich kann man dieses Verhalten unter Win/DOS ausnutzen und im Textmodus ersetzen: Code: (dl
)
perl -pi.bak -e 's/\n/\n/g' datei.txt Diese recht unverstaendliche Variante wandelt tatsaechlich die in der Datei vorhandenen einzelnen (und deshalb beim Einlesen nicht als Zeilenumbruch erkannten) <LF> in <CR><LF> um, auch wenn sie so aussieht, als taete sie gar nichts. (Diese Loesung hat sogar den kleinen Vorteil, dass man sie problemlos mehrfach auf eine Datei anwenden kann, ohne dass weitere <CR> eingefuegt werden. Das .bak ist noetig, da unter Windows irgendwie das in-place-edit nicht funktioniert.) Wie man sieht, ist es eine schlechte Gewohnheit, das perl-interne Newline-Zeichen \n als Synonym fuer ein Linefeed \012 bzw. \cJ zu benutzen. Die bessere Schreibweise waere also: Code: (dl
)
perl -pi.bak -e 's/\012/\015\012/g' datei.txt oder auch Code: (dl
)
perl -pi.bak -e 's/\x0A/\x0D\x0A/g' datei.txt wobei das .bak und das /g nur unter Windows benoetigt werden, der Code aber sowohl unter Unix/Linux als auch Windows funktioniert. Naeheres s. auch perlport, Abschnitt "Newlines" |