erstes Auftreten von hinten?

erstes Auftreten von hinten?

am 12.11.2007 11:20:32 von Astrid Kuhr

Hallo!

Moechte in einem String etwas ersetzen.

perl -wpi -e 's/ 5/ ".$fn."/g;' ".$fn.".tmp"

Aber nicht ueberall in dem String sondern nur
im ersten Auftreten von hinten.

Kann man das dem Aufruf irgendwie mit auf den
Weg geben?

Gruss, Astrid

Re: erstes Auftreten von hinten?

am 12.11.2007 12:13:51 von Frank Seitz

Astrid Kuhr wrote:
>
> Moechte in einem String etwas ersetzen.
>
> perl -wpi -e 's/ 5/ ".$fn."/g;' ".$fn.".tmp"
>
> Aber nicht ueberall in dem String sondern nur
> im ersten Auftreten von hinten.
>
> Kann man das dem Aufruf irgendwie mit auf den
> Weg geben?

Verstehe das Beispiel zwar nicht, aber wenn du
eine bestimmte, fest vorgegebene Zeichenkette
ersetzen möchtest, kannst du das mit rindex() und
substr() erreichen. Einen Schalter für Regexes
gibt es dafür meines Wissens nicht.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: erstes Auftreten von hinten?

am 12.11.2007 12:31:02 von Astrid Kuhr

Hallo!

Okidoki, besten Dank.
Dann probier ich damit mal.

Gruss, Astrid

Re: erstes Auftreten von hinten?

am 13.11.2007 10:52:04 von sheinrich

On Nov 12, 11:20 am, Astrid Kuhr wrote:
> Hallo!
>
> Moechte in einem String etwas ersetzen.
>
> perl -wpi -e 's/ 5/ ".$fn."/g;' ".$fn.".tmp"
>
> Aber nicht ueberall in dem String sondern nur
> im ersten Auftreten von hinten.
>
> Kann man das dem Aufruf irgendwie mit auf den
> Weg geben?
>
> Gruss, Astrid

Ich verstehe das Beispiel, ehrlich gesagt, auch nicht.
Es muss sich wohl um einen Systemaufruf in einem Skript handeln, woher
sonst sollte die Variable $fn stammen.
Die Kombination der Schalter -pi laesst kaum die Vermutung zu, was
hier im Ergebnis passieren wird - geschweige, was gewuenscht war. ;-)
Es waere besser, weil nachvollziehbarer, diese Umleitungen oder
Umbenennungen von Arbeitsdateien innerhalb der Skripte prozedural
abzuhandeln.

(Anm: Das "erste Auftreten von hinten" wird in der deutschen Sprache
im allgemeinen auch "das letzte Auftreten" genannt - vereinfacht das
Denken)

Zum Ersetzen des letzten Musters in einem Regex:

my $t = '123123123';

$t =~ s/^(.*)2/$1letzteZwei/;

print $t, "\n";

Ausgabe: 1231231letzteZwei3

Aber vielleicht habe ich das Problem nicht verstanden?

Fragt sich und gruesst
Steffen

Re: erstes Auftreten von hinten?

am 17.11.2007 12:50:45 von Ferry Bolhar

Frank Seitz:

> Verstehe das Beispiel zwar nicht, aber wenn du
> eine bestimmte, fest vorgegebene Zeichenkette
> ersetzen möchtest, kannst du das mit rindex() und
> substr() erreichen. Einen Schalter für Regexes
> gibt es dafür meines Wissens nicht.

Nein, man kann sich aber die "Greedyness" der Suchmaschine
(d.h., dass bei Ausdrücken wie '.+' zunächst möglichst viel gematcht
wird) zunutze machen. Ein Ausdruck wie der obige veranlasst Perl's
Suchmaschine (denn es gibt auch andere, wo es nicht so funktioniert),
zunächst _alles_ bis ans Stringende zu matchen. Folgt der Regex jetzt
noch etwas anderes, geht die Suchmaschine vom String_ende_ nach
_vorne_ zurück, um es zu finden (Backtracking). Astrid könnte also

/.+ 5/

schreiben und damit den letzten 5er (mit vier?) vorausgehenden Blanks
zu finden bzw. zu ersetzen:

s/^(.+) 5/$1".$fn."/;

Da das Finden und Ersetzen nur einmal passieren soll, ist das 'g' am
Ende überflüssig. Das '^' am Beginn ist zwar nicht notwendig, optimiert
aber bei sehr langen Strings die Verarbeitungsgeschwindigkeit.

LG, Ferry
--




> Grüße
> Frank
> --
> Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
> Anwendungen für Ihr Internet und Intranet
> Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel