7
votes

Comment puis-je vous assurer qu'une chaîne de bash est alphanumérique, sans un soulignement?

J'ajoute une fonctionnalité à un script existant qui permettra à l'utilisateur de configurer le nom d'hôte d'un système Linux. Les règles que je fais applications sont les suivantes:

  • doit être compris entre 2 et 63 caractères de long
  • ne doit pas commencer ou se terminer par un trait d'union
  • ne peut contenir que des caractères alphanumériques et des traits d'union; Tous les autres caractères ne sont pas autorisés (y compris un soulignement, ce qui signifie que je ne peux pas utiliser le symbole \ W Regex)

    J'ai résolu les deux premiers dans la liste, mais j'ai des difficultés à comprendre comment vérifier si une chaîne Bash contient uniquement des lettres, des chiffres et des traits d'union. Je pense que je peux le faire avec une regex, mais j'ai du mal à comprendre comment (j'ai passé la dernière heure à rechercher sur le Web et à lire des pages de l'homme).

    Je suis ouvert à l'utilisation de SED, Grep ou l'un des autres outils standard, mais pas Perl ou Python.


0 commentaires

4 Réponses :


18
votes

On dirait que cela devrait le faire: xxx

correspond à n'importe quel caractère alphanumérique, puis correspond à 61 caractères alphanumériques (y compris des traits d'union), puis correspond à n'importe quel caractère alphanumérique. La longueur minimale de la chaîne est 2, le maximum est de 63. Cela ne fonctionne pas avec Unicode. Si vous en avez besoin pour travailler avec Unicode, vous devez ajouter différentes classes de caractères à la place de A-ZA-Z0-9 mais le principe sera le même.

i Croyez l'expression correcte grep qui fonctionnera avec Unicode est: xxx

exemple d'utilisation:


xxx

9 commentaires

Comment utilisez-vous la deuxième expression avec Grep? Je cherche des commutateurs dans la page d'homme mais sans succès: je fais écho à une chaîne qui devrait correspondre et rien n'est émis.


@Montecristo: grep -e ou Egrep


J'ai essayé avec ceci: echo 1ASDAS * _- | grep -e '^ [[: alnum:]] [- [: alnum:]] {0,61} [[: alnum:]] $', sans sortie (aussi sans guillemets), lol je devrais demander à un question que je pense ...: p


@Montecristo: Votre chaîne de test contient un astérisque et un soulignement et se termine dans un trait d'union, dont aucun n'est autorisé par l'expression.


@Welbog: Merci beaucoup, je me manquai totalement de savoir comment utiliser ça: p


[: alnum:] n'inclut plus les traits d'union.


@Welbog puis-je demander que le symbole ^ ici [^ [: alnum:]] représente la négativité (tous les caractères non alpha et numériques)? Mais le symbole ^ ici ^ [[[: alnum:]]] représente commence par ? Et vous mentionnez qu'il fonctionne bien avec Unicode , avez-vous une référence? Merci!


Comment utilisez-vous cela


@Alexandermills: intersérder.net/tips/kb/linux- grep-commande-usage-exemples



1
votes

Ceci est pour le dernier dont vous avez besoin: SED -E 'S / [^ [: ALNUM:] | -] // g'


0 commentaires

3
votes

Il s'agit d'un script Bash testant le premier paramètre s'il ne contient que l'alphanumérique ou des traits d'union. Il "pipes" le contenu de 1 $ en Grep: xxx


2 commentaires

Pourquoi ^ représente ici la négativité au lieu de la première occurrence?


Cela signifie «début de ligne», donc chaque caractère entre celui-ci et $ doit correspondre au motif.



1
votes

Vous pouvez le faire avec juste bash xxx


0 commentaires