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
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
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
Anmeldungsdatum: 5. März 2007
Beiträge: 2130
Wohnort: Residenz des Rechts
|
So geht das:
[[ "$i" =~ regexp ]]
|
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
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
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
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:~$ && echo "Stimmt" || echo "Falsch"
Stimmt
}}} ~ sowas wie preg_match?
Ja, kann man so sagen.
|
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...)
|