web-dev-qa-db-fra.com

Expression régulière dans le script Bash

Bonjour communauté géniale,

Je suis un Dope complet quand il s'agit de regex. J'ai retardé mon apprentissage .. et maintenant ma paresse m'a rattrapé.

Ce que j'essaye de faire:
Vérifiez si une chaîne correspond à ce format:

10_06_13

c'est à dire. Date d'aujourd'hui, ou une date similaire avec "2digits_2digits_2digits"

Ce que j'ai fait:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])'
if [[ "$incoming_string" =~ $regex ]]
then
   # Do awesome stuff here
fi

Cela fonctionne dans une certaine mesure. Mais lorsque la chaîne entrante est égale à 011_100_131 ... il passe toujours le test de regex.

Je serais reconnaissant si quelqu'un pouvait m'aider à me diriger dans la bonne direction.
À votre santé

29
Robbie

=~ réussit si la chaîne à gauche contient une correspondance pour l'expression régulière à droite. Si vous voulez savoir si la chaîne correspond à l'expression régulière, vous devez "ancrer" l'expression régulière des deux côtés, comme ceci:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$'
if [[ $incoming_string =~ $regex ]]
then
  # Do awesome stuff here
fi

Le ^ ne réussit qu'au début de la chaîne et le $ ne réussit qu'à la fin.

Remarques:

  1. J'ai supprimé l'inutile () du regex et "" du [[ ... ]].
  2. Le manuel bash est mal rédigé, car il dit que =~ réussit si la chaîne correspond.
45
rici