[Vienna-pm] Gleichen Anfang in mehreren Zeilen entfernen

Roland Lammel rl at brabbel.net
Sun May 22 11:11:28 PDT 2005


Wenn ich dass halbwegs richtig verstanden hab, dann 
soll der Anfang gleicher Zeichen (die anfangs unbekannt sind)
entfernt werden von allen Zeilen:

Also soll auch
aaaaa/foo
aaaaa/bar/foo
aaaaa/bar
dann werden
foo
bar/foo
bar

Ich würde schon zuvor prozedural das größten gemeinsamen anfangs string
bestimmen und dann mit einer RE entfernen. Meines wissen, ist das mit RE
nicht möglich einen unbekannten gemeinsamen string zu entfernen.
(Andererseits kann man mit RE Sachen machen, die ich nie begreifen werd,
als möglich ist es sicher irgendwie...)

Ein einfacher Algorithmus (und noch auszuprogrammieren):

# lead als erste zeile setzen
$lead = $lines[0];
# und nun alle zeilen durchgehen (die erste könnt man auslasen)
foreach (@lines) {
	# gemeinsamen start string finden (das soll samestart machen)
	$lead = samestart($lead,$_);
}
# 
my $all = join("\n", at lines);
$all =~ s/$lead/$all/g;

Cheers

+rl

On Sun, 2005-05-22 at 19:45 +0200, Stefan Weiss wrote:
> Moin.
> 
> Ich steh wahrscheinlich nur grad böse auf der Leitung, aber ich finde
> keinen eleganten Weg, ein relativ einfaches Problem zu lösen. Mit
> elegant meine ich: keine Schleifen, nicht zuviele Regular Expressions
> (am besten nur eine).
> 
> Input:
> my $str = <<EOT;
> /home/user/dir1/dir2/file1.foo: some text
> /home/user/dir1/dir2/fee/fi/fo/fum.bar: some (more) tex/t
> /home/user/dir1/dir2/file3.baz(1243): text?
> EOT
> 
> Gewünschter Output:
> file1.foo: some text
> fee/fi/fo/fum.bar: some (more) tex/t
> file3.baz(1243): text?
> 
> Es soll also der gemeinsame Pfad am Anfang aller Zeilen (wenn vorhanden)
> entfernt werden. In diesem speziellen Fall fangen noch die
> unterschiedlichen Teile mit demselben Buchstaben an, der wenn möglich
> erhalten bleiben sollte (aber mit solchen Details kann ich mich auch
> selbst spielen, wenn ich einen geeigneten Ansatz gefunden habe).
> 
> So geht's mal nicht:
> 
>   my $leader = "";
>   if ($str =~ m#^((/[^\n]+/)(.*?))+$#s) {       # (for vim)
>       $leader = $2;
>   }
>   if ($leader) {
>       print "leader = $leader\n";
>       $str =~ s/^\Q$leader\E//gm;
>   }
>   print $str;
> 
> Das scheitert schon, wenn man die zweite und dritte Input-Zeile
> austauscht. Ich hab auch versucht, das mit Backreferences zu lösen, aber
> leider erst mal ohne Erfolg. Ich habe jetzt zwar eine vorübergehende
> Lösung mit eine Schleife in Verwendung, aber die ist alles andere als
> elegant.
> 
> Any hints?
> 
> 
> cheers,
> stefan
> _______________________________________________
> Vienna-pm mailing list
> Vienna-pm at pm.org
> http://mail.pm.org/mailman/listinfo/vienna-pm
-- 
Roland Lammel <rl at brabbel.net>



More information about the Vienna-pm mailing list