Bash
Musterübereinstimmung und reguläre Ausdrücke
Suche…
Syntax
- $ shopt -u Option # Deaktiviert die eingebaute 'Option' von Bash
- $ shopt -s Option # Aktiviert die eingebaute 'Option' von Bash
Bemerkungen
Charakterklassen
Gültige Zeichenklassen für den Globus []
werden vom POSIX-Standard definiert:
alnum alpha ascii blank cntrl digit graph unterer Druckpunkt Leerzeichen oberes Wort xdigit
Innerhalb von []
mehrere Zeichenklassen oder -bereiche verwendet werden, z.
$ echo a[a-z[:blank:]0-9]*
passt zu jeder Datei, die mit einem a
beginnt und entweder einem Kleinbuchstaben oder einem Leerzeichen oder einer Ziffer folgt.
Es sollte jedoch beachtet werden, dass ein []
Glob nur vollständig negiert werden kann und nicht nur Teile davon. Das negierende Zeichen muss das erste Zeichen sein, das auf das Öffnen folgt [
z. B. passt dieser Ausdruck auf alle Dateien, die nicht mit einem a
$ echo [^a]*
Das Folgende stimmt mit allen Dateien überein, die mit einer Ziffer oder einem ^
$ echo [[:alpha:]^a]*
Es entspricht nicht jede Datei oder einen Ordner , die mit Ausnahme eines mit mit Buchstaben beginnen a
, weil die ^
als Literal interpretiert ^
.
Glob-Zeichen entkommen
Es ist möglich, dass eine Datei oder ein Ordner ein Glob-Zeichen als Teil seines Namens enthält. In diesem Fall kann ein Glob mit einem vorangestellten \
abgehängt werden, um eine wörtliche Übereinstimmung zu erzielen. Ein weiterer Ansatz ist die Verwendung Doppel ""
oder Single ''
zitiert die Datei zu adressieren. Bash verarbeitet keine Globs, die in ""
oder ''
.
Unterschied zu regulären Ausdrücken
Der wichtigste Unterschied zwischen Globs und regulären Ausdrücken besteht darin, dass gültige reguläre Ausdrücke einen Qualifizierer sowie einen Quantifizierer erfordern. Ein Qualifier gibt an, was abgeglichen werden soll, und ein Quantifizierer gibt an, wie oft der Qualifier abgeglichen wird. Das äquivalente RegEx zum *
glob lautet .*
Wobei .
steht für ein beliebiges Zeichen und *
steht für null oder mehr Übereinstimmungen mit dem vorherigen Zeichen. Das entsprechende RegEx für die ?
glob ist .{1}
. Nach wie vor die Qualifikation .
stimmt mit einem beliebigen Zeichen überein und {1}
gibt an, dass das vorhergehende Qualifikationsmerkmal genau einmal übereinstimmt. Dies sollte nicht mit dem verwechselt werden ?
Quantifizierer, der in einem RegEx mit Null oder einmal übereinstimmt. Das []
glob is kann in RegEx genauso verwendet werden, solange ein obligatorischer Quantifizierer folgt.
Gleichwertige reguläre Ausdrücke
Glob | RegEx |
---|---|
* | .* |
? | . |
[] | [] |
Prüfen Sie, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt
Prüfen Sie, ob eine Zeichenfolge genau aus 8 Ziffern besteht:
$ date=20150624
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
yes
$ date=hello
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
no
Der * glob
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Das Sternchen * ist wahrscheinlich der am häufigsten verwendete Glob. Es passt einfach zu jedem String
$ echo *acy
macy stacy tracy
Ein einzelnes * passt nicht zu Dateien und Ordnern, die sich in Unterordnern befinden
$ echo *
emptyfolder folder macy stacy tracy
$ echo folder/*
folder/anotherfolder folder/subfolder
Der ** glob
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -s globstar
Bash kann zwei benachbarte Sternchen als einen Globus interpretieren. globstar
Option globstar
aktiviert ist, kann dies verwendet werden, um Ordner globstar
, die tiefer in der Verzeichnisstruktur liegen
echo **
emptyfolder folder folder/anotherfolder folder/anotherfolder/content folder/anotherfolder/content/deepfolder folder/anotherfolder/content/deepfolder/file folder/subfolder folder/subfolder/content folder/subfolder/content/deepfolder folder/subfolder/content/deepfolder/file macy stacy tracy
Das **
kann von einer Pfaderweiterung gedacht werden, egal wie tief der Pfad ist. In diesem Beispiel werden alle Dateien oder Ordner abgeglichen, die mit deep
, unabhängig davon, wie tief sie verschachtelt sind:
$ echo **/deep*
folder/anotherfolder/content/deepfolder folder/subfolder/content/deepfolder
Das ? glob
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Die ?
entspricht einfach genau einem Zeichen
$ echo ?acy
macy
$ echo ??acy
stacy tracy
Der [] glob
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Wenn bestimmte Zeichen gefunden werden müssen, kann '[]' verwendet werden. Jedes Zeichen in '[]' wird genau einmal abgeglichen.
$ echo [m]acy
macy
$ echo [st][tr]acy
stacy tracy
Der Globus []
ist jedoch vielseitiger als dieser. Es erlaubt auch eine negative Übereinstimmung und sogar übereinstimmende Bereiche von Zeichen und Zeichenklassen. Eine negative Übereinstimmung wird durch die Verwendung von erreicht !
oder ^
als erstes Zeichen nach [
. Wir können stacy
$ echo [!t][^r]acy
stacy
Hier sagen wir bash, dass wir nur Dateien acy
wollen, die nicht mit einem t
und der zweite Buchstabe kein r
und die Datei mit acy
endet.
Bereiche können abgeglichen werden, indem ein Zeichenpaar durch einen Bindestrich ( -
) getrennt wird. Jedes Zeichen, das zwischen diesen beiden einschließenden Zeichen (einschließlich) liegt, wird abgeglichen. Zum Beispiel ist [rt]
äquivalent zu [rst]
$ echo [r-t][r-t]acy
stacy tracy
Zeichenklassen können von [:class:]
abgeglichen werden, z. B. um Dateien abzugleichen, die ein Leerzeichen enthalten
$ echo *[[:blank:]]*
file with space
Verborgene Dateien abgleichen
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Die in Bash integrierte Option dotglob ermöglicht das Abgleichen versteckter Dateien und Ordner, dh von Dateien und Ordnern, die mit a beginnen .
$ shopt -s dotglob
$ echo *
file with space folder .hiddenfile macy stacy tracy
Groß- und Kleinschreibung wird nicht berücksichtigt
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Wenn Sie die Option nocaseglob
wird der Glob in einer Groß- und Kleinschreibung unterschieden
$ echo M*
M*
$ shopt -s nocaseglob
$ echo M*
macy
Verhalten, wenn ein Glob mit nichts übereinstimmt
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Falls der Glob mit nichts übereinstimmt, wird das Ergebnis durch die Optionen nullglob
und failglob
. Wenn keine davon gesetzt ist, gibt Bash den Glob selbst zurück, wenn nichts übereinstimmt
$ echo no*match
no*match
Wenn nullglob
aktiviert ist, wird nichts ( null
) zurückgegeben:
$ shopt -s nullglob
$ echo no*match
$
Wenn failglob
aktiviert ist, wird eine Fehlermeldung zurückgegeben:
$ shopt -s failglob
$ echo no*match
bash: no match: no*match
$
Beachten Sie, dass die failglob
Option die nullglob
Option ersetzt, dh, wenn sowohl nullglob
als auch failglob
sind, wird - falls keine Übereinstimmung vorhanden ist - ein Fehler zurückgegeben.
Erweitertes Globbing
Vorbereitung
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
Die integrierte extglob
Option von Bash kann die Übereinstimmungsfunktionen eines Globus erweitern
shopt -s extglob
Die folgenden Untermuster enthalten gültige erweiterte Globs:
-
?(pattern-list)
- Entspricht keinem oder einem Vorkommen der angegebenen Muster -
*(pattern-list)
- Stimmt mit keinem oder mehreren Vorkommen der angegebenen Muster überein -
+(pattern-list)
- Stimmt mit einem oder mehreren Vorkommen der angegebenen Muster überein -
@(pattern-list)
- Stimmt mit einem der angegebenen Muster überein -
!(pattern-list)
- Stimmt mit nichts außer einem der angegebenen Muster überein
Die pattern-list
ist eine Liste von Globs, die durch |
.
$ echo *([r-t])acy
stacy tracy
$ echo *([r-t]|m)acy
macy stacy tracy
$ echo ?([a-z])acy
macy
Die pattern-list
selbst kann eine andere, verschachtelte erweiterte Kugel sein. Im obigen Beispiel haben wir gesehen, dass wir tracy
und stacy
mit *(rt)
. Dieser erweiterte Glob selbst kann innerhalb der negierten erweiterten Glob !(pattern-list)
werden, um mit macy
$ echo !(*([r-t]))acy
macy
Es stimmt mit allem überein, was nicht mit null oder mehr Vorkommen der Buchstaben r
, s
und t
macy
.
Regex-Abgleich
pat='[^0-9]+([0-9]+)'
s='I am a string with some digits 1024'
[[ $s =~ $pat ]] # $pat must be unquoted
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
Ausgabe:
I am a string with some digits 1024
1024
Anstatt den regulären Ausdruck einer Variablen ( $pat
) zuzuweisen, können Sie auch $pat
tun:
[[ $s =~ [^0-9]+([0-9]+) ]]
Erläuterung
- Das
[[ $s =~ $pat ]]
Konstrukt führt den Regex-Abgleich durch - Die erfassten Gruppen, dh die Übereinstimmungsergebnisse, sind in einem Array mit dem Namen BASH_REMATCH verfügbar
- Der 0-te Index im BASH_REMATCH- Array ist die Gesamtübereinstimmung
- Der i'te Index im BASH_REMATCH- Array ist die i'te erfasste Gruppe, wobei i = 1, 2, 3 ...
Erhalten Sie erfasste Gruppen von einem Regex-Match gegen eine Zeichenfolge
a='I am a simple string with digits 1234'
pat='(.*) ([0-9]+)'
[[ "$a" =~ $pat ]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
echo "${BASH_REMATCH[2]}"
Ausgabe:
I am a simple string with digits 1234
I am a simple string with digits
1234