Correspondance de caractères spéciaux avec une expression régulière

10

Disons que c'est très facile si je veux trouver quelque chose contenant des lettres minuscules et des chiffres avec

produire_text | grep -E '[0-9a-z]'

Les crochets sont utiles pour faire correspondre un ensemble de caractères, mais qu'en est-il de ceux qui sont quelque peu spéciaux?
Si je veux, en utilisant des crochets, faire correspondre n'importe quel caractère sauf un: un crochet de fermeture ], un tiret (ou un trait d'union) "-", les deux barres obliques /et \, un signe d'insertion ^, un deux-points :.
Cela ressemblera-t-il à cela (je sais que cela ne fonctionne pas)?

[^] - / \ ^:]
iBug
la source

Réponses:

11

Pour faire correspondre un littéral ]et un littéral -dans une expression de parenthèse, vous devrez les utiliser comme ceci:

[^]/\^:-]

ou, mieux encore, car certains outils nécessitent l'échappement de la barre oblique inverse :

[^]/\\^:-]

c'est
-à-dire que le crochet carré droit (']') perdra sa signification spéciale et se représentera dans une expression de crochet s'il apparaît en premier dans la liste (après un '^' initial, le cas échéant)
et
le caractère trait d'union moins doit être traité comme lui-même s'il apparaît en premier (après un '^' initial, le cas échéant) ou en dernier dans la liste,
donc
si une expression entre crochets spécifie à la fois '-' et ']', le ']' sera placé en premier (après le '^', le cas échéant) et le '-' en dernier dans l'expression entre crochets.
Les règles pour les expressions entre crochets sont les mêmes pour ERE et BRE .

don_crissti
la source
2
Je doublerais la barre oblique inverse pour être du bon côté. Il est nécessaire avec de nombreuses awkimplémentations et perlpar exemple.
Stéphane Chazelas
Qu'en est-il de "Du curseur au crochet de fermeture"? Comme [^-]](celui-ci échoue)?
iBug
2
@iBug - bien sûr, il échoue car le bon support doit être le premier si vous voulez le faire correspondre littéralement. Je ne suis pas sûr d'obtenir le point de cette "plage" que vous mentionnez tel ^quel, ]donc [^-]]ne fonctionnerait pas même si les deux ^et ]ont été traités littéralement (tout comme [b-a]). Quoi qu'il en soit, si vous vouliez faire correspondre, par exemple, ;à un crochet fermant, vous pouvez utiliser une plage jusqu'au caractère précédent ](qui est une barre oblique inverse) et inclure ]comme premier caractère dans l'expression du crochet, par exemple [];-\\].
don_crissti
@don_crissti Qu'en est-il [[.^.]-[.-.]]? J'ai le sentiment que cela fonctionnerait. Supposons que le code ASCII de ^soit antérieur -.
iBug
Vous avez une solution paresseuse pour ma question. Obtenez simplement tout ce qui est spécial pour rassembler des personnages, comme[^[.].][.-.]/\^:]
iBug
7

Curieusement peut-être, vous devez avoir quelques personnages dans des endroits spécifiques. Vous devez avoir ]comme premier caractère dans un jeu et -être le dernier caractère d'un jeu.

Voici une RE qui répond à vos besoins [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
roaima
la source
1
Ce n'est pas vraiment étrange, il faut juste éviter toute ambiguïté
Kevin
1
Le deuxième [personnage n'y appartient pas; l'OP ne veut pas l'exclure.
Scott
@Scott bien repéré, merci. Réponse mise à jour.
roaima