[Vienna-pm] Gleichen Anfang in mehreren Zeilen entfernen

Stefan Weiss spaceman at foo.at
Sun May 22 10:45:47 PDT 2005


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


More information about the Vienna-pm mailing list