Ich frage mich, welche allgemeine Regel es gibt, reguläre Ausdrücke in der if-Klausel in bash zu verwenden.
Hier ist ein Beispiel
$ gg=svm-grid-ch
$ if [[ $gg == *grid* ]] ; then echo $gg; fi
svm-grid-ch
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi
$
Warum passen die letzten drei nicht zusammen?
Ich hoffe, Sie konnten so viele allgemeine Regeln wie möglich angeben, nicht nur für dieses Beispiel.
Verwenden
=~
Informationen zum regulären Ausdruck finden Sie im Tutorial zum Inhaltsverzeichnis für reguläre Ausdrücke
quelle
quelle
Hinzufügen dieser Lösung mit
grep
und grundlegenden integriertensh
Funktionen für diejenigen, die an einer portableren Lösung interessiert sind (unabhängig von derbash
Version; funktioniert auch mit einfachen alten Lösungensh
, auf Nicht-Linux-Plattformen usw.)Einige
grep
Inkarnationen unterstützen auch die-q
(leise) Option als Alternative zur Umleitung zu/dev/null
, aber die Umleitung ist wieder die portabelste.quelle
grep -q
anstelle vongrep >/dev/null
.@OP,
Nein, das "Glob" -Muster wird nicht nur für Dateinamen verwendet. Sie können damit auch Zeichenfolgen vergleichen. In Ihren Beispielen können Sie case / esac verwenden, um nach Zeichenfolgenmustern zu suchen.
Regex sind vielseitiger und "praktischer" als "Glob-Muster". Wenn Sie jedoch keine komplexen Aufgaben ausführen, die durch "Globbing / Extended Globbing" nicht einfach erledigt werden können, müssen Sie Regex nicht verwenden. Regex wird für die Version von bash <3.2 (wie von Dennis erwähnt) nicht unterstützt, Sie können jedoch weiterhin erweitertes Globbing verwenden (durch Festlegen
extglob
). Informationen zum erweiterten Globbing finden Sie hier und einige einfache Beispiele hier .Update für OP: Beispiel zum Suchen von Dateien, die mit 2 Zeichen beginnen (die Punkte "." Bedeuten 1 Zeichen), gefolgt von "g" mit Regex
zB Ausgabe
Oben werden die Dateien abgeglichen, da ihre Namen 2 Zeichen gefolgt von "g" enthalten. (dh
..g
).Das Äquivalent zu Globbing ist ungefähr so: (Siehe Referenz für die Bedeutung von
?
und*
)quelle
ls ..g
funktioniert nicht. Sie weisen die Shell an, nach einer Datei mit dem Namen zu suchen..g
. Was über regex Syntax lernen, können Sie versuchenperldoc perlretut
,perldoc perlrequick
oder eine nichtinfo sed
auf der Kommandozeile.