it-swarm.com.de

Was bedeutet [[: space:]] in bash?

Ich bin gerade auf ein Bash-Skript gestoßen. Was macht [[:space:]] meine in einem Bash-Skript? Warum der Doppelpunkt?

25
geraldin

Es steht zwar im Bash-Handbuch, aber es hilft zu wissen, wonach Sie suchen, was nicht hilfreich ist, wenn Sie nicht wissen, wonach Sie suchen beim. Wenn Sie nach [[ Gesucht haben, werden Sie vom Abschnitt [[ expression ]] Bedingter Ausdruck abgelenkt. Wenn Sie nach :space: Suchen, finden Sie zwei Beispiele im selben Abschnitt. In diesem Beispiel können Sie dem Brotkrumen folgen:

Das Folgende stimmt beispielsweise mit einer Zeile überein (die in der Shell-Variablenzeile gespeichert ist), wenn der Wert eine Folge von Zeichen enthält, die aus einer beliebigen Zahl, einschließlich Null, von Leerzeichen, Null oder einer Instanz von 'a' besteht, dann a 'b':

[[ $line =~ [[:space:]]*?(a)b ]]

... woraus man zusammensetzen könnte, dass der Teil [[:space:]] "Leerzeichen" entspricht, aber man könnte sich verzeihen, dass es sich nur um ein Literal handelt Leerzeichen und nicht eine ganze Klasse von Zeichen, was es darstellt.

Wenn Sie (zufällig?) Im Online-Bash-Handbuch nach der Zeichenfolge " space" Suchen (dh nach einem Leerzeichen gefolgt vom Wort "Leerzeichen"), gibt es "nur" ungefähr 32 Spiele zu durchlaufen. Ungefähr der zehnte wird hier sein:

Innerhalb von "[" und "]" können Zeichenklassen mithilfe 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.

Das würde Sie dann zum POSIX-Standard führen, wo Sie nach dem Begriff "Zeichenklasse" suchen und finden könnten

wctype, wctype_l - Zeichenklasse definieren , 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 Zeichentypinformationen im aktuellen Gebietsschema [CX] [Option Start] definiert ist. oder in dem durch das Gebietsschema dargestellten Gebietsschema [Optionsende] (Kategorie LC_CTYPE).

Wenn Sie dann dem Link setlocale folgen, erhalten Sie endlich Ihre eigentliche Antwort im Abschnitt Gebietsschema :

Leerzeichen

Definieren Sie Zeichen, die als Leerzeichen klassifiziert werden sollen. Im POSIX-Gebietsschema muss genau <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab> Enthalten sein.

In einer Gebietsschema-Definitionsdatei darf kein Zeichen angegeben werden, das für die Schlüsselwörter Upper, Lower, Alpha, Digit, Graph oder Xdigit angegeben ist. Das <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab> Des tragbaren Zeichensatzes und alle im Klassenleerzeichen enthaltenen Zeichen werden automatisch in diese Klasse aufgenommen.

35
Jeff Schaller

Es ist nicht nur für Bash, es ist Teil der POSIX-Notation.

Was ist POSIX?

POSIX oder "Portable Operating System Interface for UniX" ist eine Sammlung von Standards, die einige der Funktionen definieren, die ein (UNIX) Betriebssystem unterstützen sollte. Einer dieser Standards definiert zwei Arten von regulären Ausdrücken.

POSIX-Klammerausdrücke

POSIX-Klammerausdrücke sind eine spezielle Art von Zeichenklassen. POSIX-Klammerausdrücke stimmen wie normale Zeichenklassen mit einem Zeichen aus einer Reihe von Zeichen überein.

Standard POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

Keine Standards

[[:ascii:]]   ASCII characters
[[:Word:]]    Word characters (letters, numbers and underscores)

Legacy-Syntax (kann jemand einen Verweis darauf finden?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

Weitere Informationen finden Sie hier: Wiki

17
Nima

In regulären Ausdrücken und Dateinamen-Globs/Shell-Mustern stimmt das Konstrukt [...] Mit einem beliebigen der in den Klammern aufgeführten Zeichen überein. In diesen Klammern können mehrere benannte Standardzeichen Zeichenklassen verwendet werden. Eines davon ist [:space:], Das mit Leerzeichen übereinstimmt (wie \s In Perl-Regexen). Siehe z. Pattern Matching in Bashs Handbuch

[[:space:]] Ist also Teil einer regulären Ausdrucks- oder Musterübereinstimmung, die nur mit Leerzeichen übereinstimmt.

Z.B. eine Musterübereinstimmung (Standard-Shell, nicht Bash-spezifisch):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

oder ein Regex (Bash):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

Beachten Sie, dass Klammerausdrücke [...] In regulären Ausdrücken und Shell-Mustern zwar gleich funktionieren, aber im Allgemeinen sehr nicht gleich sind. (case und [[ string == pattern ]] verwenden Musterübereinstimmungen, [[ string =~ regex ]] verwendet reguläre Ausdrücke.)

Reguläre Ausdrücke sind auch nicht Shell-spezifisch, sie werden z. awk und sed ebenfalls und sind z.B. die Linux Manpage regex(7)

9
ilkkachu