web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois le message d'erreur "fin manquante] pour la classe de caractères"?

Je veux couper une chaîne avec des crochets en utilisant sed.

Comment éviter une erreur si je veux supprimer une chaîne avec [? Par exemple:

$ echo '[Om/mystring' | grep -oP '(?<=[Om\\)\w+'
grep: missing terminating ] for character class
3
Josef Klimuk

Comme le dit l’erreur fin manquante] pour la classe de caractères, le problème ici a à voir avec [, que vous devez échapper. Sinon, il est compris comme une classe de caractères par grep.

De plus, vous dites //, alors que vous souhaitez utiliser / au lieu de \ en fonction de votre saisie.

Tous ensemble, cela imprime un ensemble de mots après [Om/:

$ echo '[Om/mystring' | \grep -oP '(?<=\[Om\/)\w+'
mystring
7
fedorqui

Vous obtenez l'erreur car [ est un caractère spécial dans la syntaxe d'une expression régulière, introduisant un classe de caractères . Pour être traité comme un littéral de chaîne, il doit être échappé, à savoir \[

Si vous voulez simplement supprimer le préfixe [Om/, il est alors plus simple d'utiliser un délimiteur qui n'apparaît pas dans le motif:

$ echo '[Om/mystring' | sed 's;\[Om/;;'
mystring
6
steeldriver