linux-l: Neuer Zeilenumbruch?
Jens Dreger
jens.dreger at physik.fu-berlin.de
Di Jan 18 08:13:37 CET 2000
On Tue, Jan 18, 2000 at 12:20:28AM +0100, Carsten Wartmann wrote:
> Hi,
>
> ich habe einen Text als ASCII, den ich gerne neu umbrechen möchte, er
> hat jetzt Linefeeds (0x0a). Einzelne sollen raus (besser gegen
> Leerzeichen austauschen), doppelte aber drinn bleiben!
Hi Carsten !
Man nehme perl, was sonst ;-)
perl -0pe 's/(?<!\n)(\n)(?!\n)/ /g' datei.alt > datei.neu
oder gleich "in-place":
perl -0pi -e 's/(?<!\n)(\n)(?!\n)/ /g' datei.alt
Wahrscheintlich denkst Du jetzt: "Daaas soll ich auf meinen arment
ASCII-Text loslassen ? Und wenn's schiefgeht ?!?". Richtig, also
testen:
echo -e "1\n2\n\n3\n4" | perl -0pe 's/(?<!\n)(\n)(?!\n)/X/g' | od -tc
0000000 1 X 2 \n \n 3 X 4 X
Der pattern (?<!\n)(\n)(?!\n) matched ein \n, welches nicht auf ein \n
folgt und auch nicht vor einem \n steht. Also ein einsames \n.
-0 stellt den Record-Separator auf 0-Byte, sonst wuerde perl an den \n
splitten, so dass man keine Chance haette, einzelne \n zu finden.
Man kann auch verwenden:
perl -00 -pe 's/\n/x/'
wodurch aber mehrere aufeinanderfolgende Leerzeilen in eine
Leerzeile umgewandelt werden:
-------8<-----------------
dreger at smart:~> echo -e "1\n2\n\n\n\n3\n4"
1
2
3
4
dreger at smart:~> echo -e "1\n2\n\n\n\n3\n4" | perl -00 -pe 's/\n/ /'
1 2
3 4
-------------8<---------------
Es gibt sicher noch tausend andere Moeglichkeiten...
Um die Datei gleich auf eine andere Spaltenbreite zu bekommen, kann
man vielleicht sowas wie
perl -0pe 's/(?<!\n)(\n)(?!\n)/ /g; s/(.{30}\s)/$1\n/g'
benutzen. Aber irgendwie habe ich da Gefuehl, das geht einfacher...
Naja, funktioniert aber scheinbar...
Gruss,
Jens.
Mehr Informationen über die Mailingliste linux-l