• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Letztes Vorkommen eines Zeichens in einem String

Olti1986

Member
Hallo!

Ich habe in einem String einen kompleten Pfad inc. Dateinamen stehen und möchte nun wissen an welcher Stelle das letzte mal das Zeichen "/" vorkommt um den Dateinamen rauszukopieren.
Kann mir jemand sagen wie ich das machen kann??

MFG Olti
 
Moin Olti1986,

indem Du den String von hinten durchsuchen läßt? Die meisten Programmiersprachen haben bei der Stringmanipulation diese Möglichkeit.
 

andreasw

Member
in java würde ich das so machen.

string.lastIndexOf('/');

das liefert dann eben das letzte auftreten von /, oder -1, falls / nicht vorkommt.

mfg

Andy
 
A

Anonymous

Gast
Gehts noch auch noch komplizierter? dazu gibt es doch fertige Kommandos
Code:
 # basename /Path/zur/Datei/ist/hier/einfach/viel/zu/lang/dateiname.txt
dateiname.txt

siehe auch:
man basename
man dirname
info coreutils


robi
 

andreasw

Member
Ja es gibt unendlich viele Möglichkeiten ;), aber die entscheidende Frage ist eh, mit was er programmiert, erst dann kann man ihm ja die beste Lösung sagen.

In java nützt mir z. B. basename nix ;).

Wobei er es dort dann auch noch auf die Methode:

Code:
File file = new File(string);
String name = file.getName();

lösen könnte.

mfg

Andy
 
OP
O

Olti1986

Member
Sorry hatte vergessen zu sagen, dass ich in C++ Programmiere.
Hab des Problem mittlerweile auch gelöst.

MFG Olti
 

regexer

Advanced Hacker
Zinnwurm schrieb:
Regex kann sowas natürlich.
Code:
/.*\/(.+)$/
Wobei das (.+)$ überflüssig ist. Perl, sed usw. suchen alle meines wissens nach automatisch nach dem längstmöglichen Treffer. Also genügt:
Code:
/.*\//
oder auch
Code:
#.*/#
Hiermit ist die von longman geforderte Lesbarkeit fast wiederhergestellt. :wink:
 

TeXpert

Guru
notoxp schrieb:
Zinnwurm schrieb:
Regex kann sowas natürlich.
Code:
/.*\/(.+)$/
Wobei das (.+)$ überflüssig ist. Perl, sed usw. suchen alle meines wissens nach automatisch nach dem längstmöglichen Treffer.

ja, bei perl kannst Du zwar noch mit nongreedy-Optionen arbeiten aber sed kann das AFAIK nicht. (daher muss man bei sed auch so häufig zu negationen greifen ;) )
 

regexer

Advanced Hacker
TeXpert schrieb:
ja, bei perl kannst Du zwar noch mit nongreedy-Optionen arbeiten aber sed kann das AFAIK nicht. (daher muss man bei sed auch so häufig zu negationen greifen ;) )
Greedy ist doch genau das, was gewünscht ist. Ich wollte mich nur nicht soweit aus dem Fenster lehnen, dass ALLE Sprachen, die RegExp unterstützen standardmäßig gierig sind.
Ich kenne nämlich nicht alle, aber mitlerweile weiß ich, dass auch PHP sich wie beschrieben verhält.
 

TeXpert

Guru
notoxp schrieb:
Greedy ist doch genau das, was gewünscht ist.
hier ja, ich wollte Dir ja auch nur recht geben :)

Ich wollte mich nur nicht soweit aus dem Fenster lehnen, dass ALLE Sprachen, die RegExp unterstützen standardmäßig gierig sind.
Ich kenne nämlich nicht alle, aber mitlerweile weiß ich, dass auch PHP sich wie beschrieben verhält.

sagen wir so :) alle mir bekannten RegEx-Engines arbeiten Greedy...
 

Zinnwurm

Hacker
Aber um den Dateinamen rauszukriegen braucht er doch theoretisch eben den Teil nach dem Slash. (darum war bei mir auch das (.+) drin, denn dann kann man den Tei rausreferenzieren. ^^)
Natürlich kann man den sich ergebenden String auch noch vom Original "abziehen", aber dann bräuchte man zwei Arbeitsschritte.
 

regexer

Advanced Hacker
Zinnwurm schrieb:
(darum war bei mir auch das (.+) drin, denn dann kann man den Tei rausreferenzieren. ^^)
Natürlich kann man den sich ergebenden String auch noch vom Original "abziehen", aber dann bräuchte man zwei Arbeitsschritte.
Also, folgende Befehle liefern genau das gleiche Ergebnis. Oben ist deine RegExp, unten ist meine.
Code:
echo /dir/verz/dir/verz/datei | sed 's/.*\/\(.*\)$/\1/'
echo /dir/verz/dir/verz/datei | sed 's#.*/##'
Da braucht man kein "Abziehen" oder einen anderen zweiten Arbeitsschritt. Oder habe ich dich falsch verstanden?
 

Zinnwurm

Hacker
Ah, du hast schon Recht. ^^
Wir sind unterschiedlich an das Problem rangegangen. Ich hatte eher im Hinterkopf, die Matches auszulesen. ^^"
 
Oben