Je viens de tomber sur un script bash. Que [[:space:]]
signifie un script bash? Pourquoi le double colon?
C'est, en effet, dans le manuel bash, mais cela aide à savoir ce que vous cherchez, ce qui n'est pas utile si vous ne savez pas ce que vous regardez. Si vous recherchiez, [[
vous seriez distrait par la [[ expression ]]
section des expressions conditionnelles. De plus, la recherche de :space:
terrains vous donne deux exemples dans la même section. Vous pouvez suivre le fil d'Ariane dans cet exemple:
Par exemple, ce qui suit correspondra à une ligne (stockée dans la ligne de variable shell) s'il y a une séquence de caractères dans la valeur consistant en n'importe quel nombre, y compris zéro, des caractères d'espace, zéro ou une instance de 'a', puis un «b»:
[[ $line =~ [[:space:]]*?(a)b ]]
... à partir duquel vous pourriez reconstituer que la [[:space:]]
partie correspondait à des "caractères spatiaux", mais vous pourriez être pardonné de penser que ce n'était qu'un caractère spatial littéral et non une classe entière de caractères, ce qu'elle représente.
Si vous (par hasard?) Recherchez la chaîne " space"
(c'est-à-dire un espace suivi du mot "espace") dans le manuel bash en ligne , il n'y a "que" environ 32 correspondances à parcourir. Le dixième sera ici:
Dans '[' et ']', les classes de caractères peuvent être spécifiées en utilisant la syntaxe [: class:], où class est l'une des classes suivantes définies dans la norme POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Une classe de caractères correspond à tout caractère appartenant à cette classe.
Ce qui vous amènerait ensuite au standard POSIX où vous pourriez rechercher le terme "classe de caractères" et trouver
wctype, wctype_l - définit la classe de caractères , qui vous amène jusqu'à:
Les fonctions wctype () [CX] [Option Start] et wctype_l () [Option End] doivent déterminer les valeurs de wctype_t selon les règles du jeu de caractères codés définies par les informations de type de caractère dans les paramètres régionaux actuels [CX] [Option Start] ou dans les paramètres régionaux représentés par les paramètres régionaux, respectivement [Option End] (catégorie LC_CTYPE).
Si vous suiviez ensuite le lien setlocale , vous obtiendriez enfin votre vraie réponse, dans la section Paramètres régionaux :
espace
Définissez les caractères à classer comme caractères d'espacement. Dans l'environnement local POSIX, exactement
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
doit être inclus.Dans un fichier de définition de paramètres régionaux, aucun caractère spécifié pour les mots clés supérieur, inférieur, alpha, chiffre, graphique ou xdigit ne doit être spécifié. Le jeu
<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>
de caractères portable et tous les caractères inclus dans le blanc de classe sont automatiquement inclus dans cette classe.
LESS=+'/Within \[ and \],' man bash
au lieu de 32n
commandes ext :-).less +"$cmd"
, alors merci pour cela.[]
est indépendant de l'intérieur[]
. J'ai essayé (!) De trouver un moyen de passer de la question à la réponse sans trop savoir quelle était la réponse, même s'il a fallu un peu de chance pour deviner :)Ce n'est pas seulement pour Bash, cela fait partie de la notation POSIX.
Qu'est-ce que POSIX?
Expressions du support POSIX
POSIX standard
Aucune Normes
syntaxe héritée (quelqu'un peut-il y trouver une référence?)
Vous pouvez trouver plus d'informations ici: wiki
la source
[[:ascii:]]
, et[[:word:]]
ne sont pas des classes POSIX (elles semblent êtrebash
spécifiques), et je ne peux pas trouver[[:<:]]
non[[:>:]]
plus. Une meilleure référence peut avoir été pubs.opengroup.org/onlinepubs/9699919799/basedefs/…[[:ascii:]]
et il[[:word:]]
n'y a pas de classes POSIX standard. pour[[:<:]]
et[[:>:]]
, je ne trouve aucune référence, mais c'est la même chose\b
. en.wikipedia.org/wiki/Regular_expression#Character_classes[[:<:]]
et affirme que: Il s'agit d'une extension compatible avec mais non spécifiée par POSIX 1003.2[[:<:]]
est également dans FreeBSD, avec la même mise en garde que PostgreSQL: freebsd.org/cgi/…[[:ascii:]]
et[[:word:]]
des travaux de cours en Bash en correspondance de motif, mais pas dans les expressions régulières (au moins sur mon système, je pense que Bash utilise la bibliothèque regex du système). Bah.Dans les expressions régulières et les modèles globs / shell de nom de fichier, la
[...]
construction correspond à n'importe quel caractère de ceux répertoriés entre crochets. Dans ces crochets, un certain nombre de classes de caractères de caractères standard nommées peuvent être utilisées. L'un d'eux est celui[:space:]
qui correspond aux caractères d'\s
espacement (comme dans les expressions rationnelles Perl). Voir par exemple Pattern Matching dans le manuel de BashDonc,
[[:space:]]
fait partie d'une expression régulière ou d'une correspondance de modèle, qui correspond uniquement aux espaces blancs.Par exemple, une correspondance de modèle (shell standard, non spécifique à Bash):
ou une expression régulière (Bash):
Notez que même si les expressions entre crochets
[...]
fonctionnent de la même dans les expressions régulières et des motifs shell, ils sont généralement très pas la même chose. (case
et[[ string == pattern ]]
utiliser des correspondances de motifs,[[ string =~ regex ]]
utilise des expressions rationnelles.)Les expressions régulières ne sont pas non plus spécifiques au shell, elles sont utilisées par exemple
awk
etsed
aussi, et sont décrites par exemple dans la page de manuel Linuxregex(7)
la source