ubuntuusers.de

Prüfen ob Variable Regex matched (Bash)

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

hannemann

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Hallo,

ich möchte mir alle Verzeichnisse ausgeben lassen, die einem ganz simplen Regex entsprechen sollen, nämlich ein paar Zeichen, dann ein Punkt aund dann ein paar Zeichen (Vhost-Verzeichnis)

ich mach das so:

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && echo $i | egrep '.+\..+' > /dev/null; then echo $i; fi; done;

gibt es für den Regex-Part (echo $i | egrep '.+\..+' > /dev/null) auch eine elegantere und schnellere Lösung? Mit test habe ich es nicht hinbekommen.

Andy1

Avatar von Andy1

Anmeldungsdatum:
24. August 2005

Beiträge: 1362

Wohnort: Thüringen

Da ich auch erst mich mit solchem beginne zu befassen ist dies meine erste Anlaufstelle.
http://www.regenechsen.de/phpwcms/index.php?regex

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

Also erstmal gibts für grep den Parameter "-q" der dazu dient, sich das ">/dev/null" zu sparen

In diesem Fall gehts aber einfacher:

if [[ "$i" == ?*.*? ]];


Siehe "man bash", Abschnitt "Pattern Matching"

Oder du machst es gleich so:

for i in ?*.*?; do

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Mit RegExp an sich bin ich schon ganz gut vertraut. Mir geht es darum, wie ich in der Bash einen String prüfen kann, also welches Kommando.

echo $var | egrep finde ich ein wenig von hinten durch die Brust ins Auge. Vielleicht gibt es ja ein Kommando, was das direkter kann.

sowas wie variable.match(/.+\..+/) in JS oder preg_match($reg, $var) in php.

Bisher habe ich nur Kommandos gefunden, die Strings ersetzen wie z.B.: ${varname//pattern/replace/}
Da muss es doch auch was geben, was einfach nur prüft im Zusammenhang mit test bzw [ $i == Regexp ] oder sowas

Ich empfehle gerne http://www.regular-expressions.info/tutorial.html

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

So geht das:

[[ "$i" =~ regexp ]]

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

hannemann hat geschrieben:

ich mach das so:

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && echo $i | egrep '.+\..+' > /dev/null; then echo $i; fi; done;

Falscher Ansatz. Für sowas gibt es find:

find /srv/www/vhosts -maxdepth 1 -type d | tail -n +2


(Das tail weil find den Ausgangsordner als erstes mit ausgibt)

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

Wenn schon, denn schon:

find /srv/www/vhosts -mindepth 1 -maxdepth 1 -type d

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Es gibt einen Schalter -mindepth? 😲

Das wusste ich nicht *notier*

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Des findet aber auch Verzeichnisse, die ich nicht haben will.
Ich will nur die Verzeichnisse haben, die diesem RegExp enstprechen: .+\..+

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Okay, dann eben so:

find /srv/www/vhosts -mindepth 1 -maxdepth 1 -type d -regex '.+\..+'

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Danke... Da hätte ich auch selber drauf kommen müssen... *patsch an stirn*

Trotzdem, wie kann ich eine Variable gegen eine RegExp prüfen...

Also Übersetz das mal bitte in bash:

if (preg_match('/.+\..+/', $var)) {
    do something
}

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

if [[ "$var" =~ '/.+\..+/' ]]
then
    do something
fi

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Aaah Danke...

Nur das die RegExp so aussehen muss .+\..+ Die Delimiter muss man weglassen.

Ich sehe schon. Die Bash verlangt viel Umgewöhnung...

Warum denn 2mal [ und bedeutet =~ sowas wie preg_match?

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

"[[" ist das "test" Built-in der Shell, was man für normale Tests und fürs Vergleichen von Strings verwenden kann (Natürlich kannst du auch das einzelne "[" oder "test" verwenden, was aber externe Kommandos sind).

Daneben gibt es auch noch "\((", welches man für arithmetische Vergleiche verwendet, weil:\\ {{{martin@martin-desktop:~$ [[ 3 < 10 ]] && echo "Stimmt" || echo "Falsch" Falsch martin@martin-desktop:~$ [1] && echo "Stimmt" || echo "Falsch" Stimmt }}}

~ sowas wie preg_match?

Ja, kann man so sagen.

  • 1: 3 < 10

hannemann

(Themenstarter)

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

Mr. Kanister hat geschrieben:

Natürlich kannst du auch das einzelne "[" oder "test" verwenden, was aber externe Kommandos sind[/quote]

Nur ein [ funktioniert nicht, deshalb fragte ich nochmal nach.

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && [[ "$i" =~ '.+\..+' ]]; then echo $i; fi; done;


funktioniert,

for i in $(ls /srv/www/vhosts);do if [ -d /srv/www/vhosts/$i ] && [ "$i" =~ '.+\..+' ]; then echo $i; fi; done;


funktioniert nicht.

bash: [: =~: binary operator expected
.
.
.

(Der Code ist nur ein Beispiel, die Lösung von Blattlaus ist natürlich besser...)

Antworten |