PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash - regex



Rainbow-Warrior
31-01-2008, 17:59
Hallo zusammen,

ich bin bisher ziemlich gut um regular expressions rumgekommen. Manchmal habe ich mein Vorhaben einfach in php umgesetzt ;-). Aber jetzt möchte ich gerne in der Shell bleiben.



echo "/home/blabla/key_blabla.pub"


Ich möchte in einem Bash-Script, den Namen inklusive Datei-Erweiterung haben. In Bash weiß ich keinen Weg, wie ich da um regex rumkomme. Das ist auch in sofern nicht schlimm, da es nicht schaden kann es zu lernen. Ich bin aber mit meinen Versuchen kläglich gescheitert..

Die Frage die ich mir stelle ist auch, nehme ich dafür grep oder sed.

Also ich möchte key_blabla.pub zurück bekommen:



echo "/home/blabla/key_blabla.pub" | grep '$*/'


Das ist einer meiner Versuche, ich habe auch probiert mit Parametern gearbeitet, ohne erfolg.

Die andere wichtige Frage die ebenfalls aufgekommen ist:
Sind regex überall gleich. Ich weiß das es gewisse unterschiede von Sprache zu Sprache gibt, aber z.B. ein "$" sollte doch überall das gleich bedeuten oder?

Ich hoffe es kann mir jemand bei meinem Problem helfen.

Gruß Björn

Aqualung
31-01-2008, 18:15
echo "/home/blabla/key_blabla.pub" | sed "s/^.*\///"

Erläuterung:
s/ = Substitute(ersetze):
------------------------------
^=Anfang der Zeile
.=ein beliebiges Zeichen
.*=beliebig viele beliebige Zeichen
bis \/ , gequoteter slash
-------------------------------
/ durch
/ nix.

HTH Aqualung

Rainbow-Warrior
31-01-2008, 18:23
Hi,

cool Danke! Ich wusste das es relative einfach ist, aber ich habe es einfach nicht gebacken bekommen. Es ist ja schon daran gescheitert das ich dachte das "*" beliebig viele beliebige Zeichen bedeutet. Okay das hat mich ein ganzes Stück in Sachen logik von Regex weitergebracht.

Gruß Björn

jan61
31-01-2008, 20:05
Moin,

noch was zu den Unterschieden: Es gibt einfache und erweiterte reguläre Ausdrücke, sed und grep arbeiten standardmäßig mit einfachen. Für erweiterte stehen ind sed der Schalter -r und in grep der Schalter -E zur Verfügung. Damit hast Du dann z. B. + (vorheriges Zeichen oder Gruppe mindestens 1x) zusätzlich zur Verfügung. Perl nutzt immer Extended RegEx.

@Aqualung: Der Zeilenanfang ^ ist in diesem Fall überflüssig, weil regex per Default "greedy" (gierig) sind - eine regex wie .* greift sich also immer den größtmöglichen Bereich aus dem String ab.

Jan

P.S.: Du hättest Dich noch weiter vor regex drücken können ;-)

jan@jack:~/tmp> basename "/home/blabla/key_blabla.pub"
key_blabla.pub