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