Regex-Frage

Guten Tag,

ich weiß, dass ich hier falsch bin und lieber im im Brett Programmierung nachfragen sollte, aber irgendwie habe ich das Gefühl, hier wird mir besser geholfen. Es geht um die gute bash-Programmierung und meinen natural born enemy: regex.

Ich habe das folgende Wunderscript geschrieben:

#!/bin/bash
CLUSTER\_NODE=`hostname`
echo $CLUSTER\_NODE

Ich glaube nicht, dass ich dem erfahrenen bash-Benutzer erklären muss, was der Aufruf dieses Scripts bewirkt. Ich frage aber den erfahrenen bash-Programmierer, ob und wie ich mit einer Regex die Ausgabe ändern kann.

Ich habe hier die Maschinen web9, web10 und web111. Zumindest behauptet das der Befehl hostname (und somit auch mein wunderbares Script). Ich möchte aber, dass als Ausgabe meines Scripts dort nur 9, 10 und 111 steht, dass also die Buchstaben verschwinden und nur die Ziffern übrig bleiben.

Geht das überhaupt per regex? Wenn ja, bitte ich um ein Beispiel, und weiterhin bitte ich um den Verzicht auf Links zu irgendwelchen Websites, die das Thema regex hoch und herunter deklinieren. Ich habe sie bestimmt alle gelesen. Regex ist einfach zuviel für meinen Dummschädel, und was ich in den letzten zehn Jahren nicht begriffen habe, wird wohl auch demnächst nicht an mich gehen. Daher werden mich auch der sicherlich gut gemeinte Hinweis auf man pages oder ein einfaches RTFM nicht glücklich machen können.

Wenn mir jemand vielleicht einfach hinschreiben könnte, wie ich die obige Fragestellung lösen kann, dann nehme ich ihn in mein Nachtgebet auf.

Nein, das sind keine Schulaufgaben. Ich muss seit fast 20 Jahren keine mehr machen (es gibt sie tatsächlich, die Gnade der frühen Geburt).

Stefan

Moin,

#!/bin/bash
CLUSTER\_NODE=`hostname`
echo $CLUSTER\_NODE | tr -d '[a-z]'

so geht’s.

Gruß,

Malte.

CLUSTER\_NODE=`hostname | sed s/\[^0-9\]//g`
echo $CLUSTER\_NODE

sollte es in dem Fall auch tun…

so geht’s.

Ich bin völlig entzückt. Vielen Dank.

Stefan

sollte es in dem Fall auch tun…

Hier werden Sie geholfen. Danke, ich hab doch gewusst, dass ich in diesem Forum richtig bin.

Stefan

so geht’s.

Ich bin völlig entzückt. Vielen Dank.

no prob. Wobei zu bemerken ist, daß meine Lösung wirklich nur ein Schnellschuß war und so nur in Deinem konkreten Anwendungsfall funktioniert. In dem Moment, wo die Ausgabe von „hostname“ anders aussieht, also Großbuchstaben, Punkte oder andere Sonderzeichen enthält, oder Ziffern auch an anderer Stelle, funktioniert das nicht mehr. Außerdem ändere ich nur die Ausgabe, nicht die Variable an sich, falls Du das Skript also irgendwann mal erweitern willst, befindet isch in der Variable immer noch der komplette Hostname.

Nur so als Hinweis, um Schwierigkeiten zu vermeiden.

Gruß,

Malte.

PS: Bzgl. des Nachtgebetes laß mich doch da raus, ich hab mit dem da oben nix am Hut. Aber es ist vielleicht nicht verkehrt, für Menschen zu beten, die nix zu essen haben. :wink:

CLUSTER_NODE=hostname | sed s/\[^0-9\]//g
echo $CLUSTER_NODE

Ich mag sowas:

CLUSTER\_NODE=`hostname | sed s/\[^\[:digit:\]\]//g`
echo $CLUSTER\_NODE

Das schöne an Uni*x: Viele Wege führen zu RatzBenedikt.

Gruß,

Sebastian

Außerdem ändere ich nur
die Ausgabe, nicht die Variable an sich, falls Du das Skript
also irgendwann mal erweitern willst, befindet isch in der
Variable immer noch der komplette Hostname.

Das habe ich gesehen.

PS: Bzgl. des Nachtgebetes laß mich doch da raus, ich hab mit
dem da oben nix am Hut.

Ein Glück, ich nämlich auch nicht :wink:

Stefan

Hi!

CLUSTER_NODE=hostname | sed s/\[^0-9\]//g
echo $CLUSTER_NODE

Das ist sehr praktisch, in so einfachen Fällen kann dir aber auch die „bash“ selbst helfen. Schau einfach mal
man bash
und suche (mit der ‚/‘ Taste) nach ‚##‘. dort in der gegend sind einige leider weitgehend unbekannte aber äußerst praktische Verfahren, wie man Paramter ersetzen kann.

In deinem Fall zB
echo ${CLUSTER_NODE%%[0-9]*}

Du ersparst dir dadurch den Aufruf von ‚sed‘ und eine Pipe.

Bye
Hansi