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

3,0

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

4,0

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

2,02

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow