Ich bin gerade auf ein Bash-Skript gestoßen. Was [[:space:]]
bedeutet in einem Bash-Skript? Warum der Doppelpunkt?
Es steht zwar im Bash-Handbuch, aber es hilft zu wissen, wonach Sie suchen. Dies ist nicht hilfreich, wenn Sie nicht wissen, wonach Sie suchen. Wenn Sie nach suchen, werden [[
Sie durch den [[ expression ]]
Abschnitt für bedingte Ausdrücke abgelenkt . Darüber hinaus finden :space:
Sie in zwei Beispielen im selben Abschnitt die Suche nach Ländern. Sie können der Brotkrume in diesem Beispiel folgen:
Das Folgende passt beispielsweise zu einer Zeile (in der Shell-Variablenzeile gespeichert), wenn der Wert eine Folge von Zeichen enthält, die aus einer beliebigen Zahl, einschließlich Null, Leerzeichen, Null oder einer Instanz von 'a' und dann a besteht 'b':
[[ $line =~ [[:space:]]*?(a)b ]]
... aus dem man zusammensetzen konnte, dass der [[:space:]]
Teil "Leerzeichen" entsprach, aber man konnte sich verzeihen, dass es sich nur um ein buchstäbliches Leerzeichen und nicht um eine ganze Klasse von Zeichen handelte, für die es steht.
Wenn Sie (zufällig?) " space"
Im Online-Bash-Handbuch nach der Zeichenfolge (dh einem Leerzeichen, gefolgt vom Wort "Leerzeichen" ) suchen , müssen "nur" etwa 32 Übereinstimmungen ausgeführt werden. Ungefähr der zehnte wird hier sein:
Innerhalb von '[' und ']' können Zeichenklassen mit der Syntax [: class:] angegeben werden, wobei class eine der folgenden im POSIX-Standard definierten Klassen ist:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Eine Zeichenklasse entspricht jedem Zeichen, das zu dieser Klasse gehört.
Was würde Sie dann zum POSIX-Standard bringen, wo Sie nach dem Begriff "Zeichenklasse" suchen und finden könnten
wctype, wctype_l - Definiert die Zeichenklasse , mit der Sie Folgendes erreichen :
Die Funktionen wctype () [CX] [Option Start] und wctype_l () [Option End] bestimmen die Werte von wctype_t gemäß den Regeln des codierten Zeichensatzes, der durch die Zeichentypinformationen im aktuellen Gebietsschema [CX] [Option Start] definiert ist. oder in dem Gebietsschema, das durch das Gebietsschema dargestellt wird, jeweils [Option End] (Kategorie LC_CTYPE).
Wenn Sie dann den gefolgt setlocaleQ Link, würden Sie schließlich Ihre wirkliche Antwort bekommen, in dem Abschnitt Locale :
Platz
Definieren Sie Zeichen, die als Leerzeichen klassifiziert werden sollen. Im POSIX-Gebietsschema muss genau angegeben
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
werden.In einer Gebietsschemadefinitionsdatei darf kein Zeichen für die Schlüsselwörter "Upper", "Lower", "Alpha", "Digit", "Graph" oder "XDIGIT" angegeben werden. Die
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
Zeichen des portablen Zeichensatzes und alle im Klassenleerzeichen enthaltenen Zeichen werden automatisch in diese Klasse aufgenommen.
LESS=+'/Within \[ and \],' man bash
anstelle von 32n
ext-Befehlen zu finden :-).less +"$cmd"
, also danke dafür.[]
vom Inneren unabhängig ist[]
. Ich habe versucht , einen Weg aus der Frage auf die Antwort zu finden , ohne zu wissen (!) Zu viel über das, was war die Antwort, obwohl es einige Glück Erraten :) nahmEs ist nicht nur für Bash, es ist Teil der POSIX-Notation.
Was ist POSIX?
POSIX-Klammerausdrücke
Standard POSIX
Keine Standards
Legacy-Syntax (kann jemand auf diese verweisen?)
Weitere Informationen finden Sie hier: Wiki
quelle
[[:ascii:]]
Und[[:word:]]
ist nicht POSIX - Klassen (sie zu sein scheintbash
-spezifische), und ich kann nicht finden ,[[:<:]]
noch[[:>:]]
nicht. Eine bessere Referenz könnte pubs.opengroup.org/onlinepubs/9699919799/basedefs/…[[:ascii:]]
und das[[:word:]]
sind keine POSIX-Standardklassen. Für[[:<:]]
und[[:>:]]
kann ich keine Referenzen finden, aber es ist das gleiche\b
. en.wikipedia.org/wiki/Regular_expression#Character_classes[[:<:]]
und behauptet, dass: Dies eine Erweiterung ist, die mit POSIX 1003.2[[:<:]]
ist auch in FreeBSD mit dem gleichen Vorbehalt wie PostgreSQL: freebsd.org/cgi/…[[:ascii:]]
und[[:word:]]
natürlich Arbeit in Bash in Pattern - Matching, aber nicht in regulären Ausdrücken (zumindest auf meinem System, ich denke , Bash das regex Bibliothek System verwendet). Bah.In regulären Ausdrücken und Globs / Shell-Mustern für Dateinamen stimmt das
[...]
Konstrukt mit einem beliebigen Zeichen der in Klammern aufgeführten Zeichen überein. Innerhalb dieser Klammern, eine Reihe von Namen Standard - Zeichenzeichenklassen verwendet werden. Eines davon ist[:space:]
, das mit Leerzeichen übereinstimmt (wie\s
in Perl-Regexen). Siehe zB Pattern Matching in Bashs HandbuchIst
[[:space:]]
also ein Teil eines regulären Ausdrucks oder einer Musterübereinstimmung, die nur mit Leerzeichen übereinstimmt.ZB eine Musterübereinstimmung (Standard-Shell, nicht Bash-spezifisch):
oder ein Regex (Bash):
Beachten Sie, dass obwohl Klammerausdrücke
[...]
gleich in regulären Ausdrücken und Shell - Muster arbeiten, sie sind in der Regel sehr viel nicht gleich. (case
und verwende Musterübereinstimmungen[[ string == pattern ]]
,[[ string =~ regex ]]
verwende Regexes.)Reguläre Ausdrücke sind auch nicht shellspezifisch, sie werden zB auch in
awk
und verwendetsed
und sind zB in der Linux-Manpage beschriebenregex(7)
quelle