Comment vérifier si une chaîne contient une sous-chaîne dans Bash

How Check If String Contains Substring Bash



La question est de savoir comment vérifier si une chaîne contient une sous-chaîne dans Bash. La réponse est : utilisez Pattern Matching. Cela soulève une autre question, qui est : qu'est-ce que le Pattern Matching ? Eh bien, une phrase dans une phrase a certaines caractéristiques. C'est pourquoi il diffère des autres expressions dans la même phrase ou dans d'autres phrases. Les caractéristiques peuvent être codées sous forme de modèle. De cette façon, une phrase particulière dans une chaîne peut être identifiée. Cet article explique comment identifier une sous-chaîne particulière dans une chaîne plus grande, remplacer la sous-chaîne correspondant à une autre sous-chaîne et localiser toute sous-chaîne dans une chaîne plus grande par index. Cependant, avant de plonger dans les explications, il faut rappeler les différentes manières d'établir une chaîne dans Bash.

Chaîne en échappant des espaces

Une chaîne peut être construite en remplaçant chaque espace par la séquence d'échappement d'espace, «  » ; un péché:







maVar=Tourismedans L'Égypte est l'un de le pays 's principales industries économiques.
chassèrent $maVar

La sortie est :



Le tourisme en Égypte est l'une des principales industries économiques du pays.



Remarque : l'apostrophe utilisait également la séquence d'échappement d'espace.





Chaîne par guillemets simples

Le programmeur a-t-il le temps d'échapper à tous les espaces d'une chaîne ? Non. Par conséquent, il est préférable d'utiliser deux guillemets simples pour délimiter une chaîne ; tel que:

maVar='Le tourisme en Egypte est l'un des pays' ''s principales industries économiques.'

Une chaîne entre guillemets simples ne permet pas l'expansion (remplacement par son effet) d'aucune séquence d'échappement. Heureusement, si deux chaînes sont codées l'une à côté de l'autre, elles seront considérées comme une seule chaîne. Une séquence d'échappement peut être insérée entre les deux, comme indiqué ci-dessus. La séquence d'échappement serait étendue. La sortie devient donc :



Le tourisme en Égypte est l'une des principales industries économiques du pays.

Chaîne par guillemets doubles

Avec les guillemets doubles, les séquences d'échappement ne sont pas également développées, mais les variables sont développées. Le code suivant illustre cela :

maVar=Tourismedans L'Égypte est l'un de le pays 's principales industries économiques.
chassèrent $maVar

La sortie est :

Le tourisme en Égypte est l'une des principales industries économiques du pays.

Remarque : l'apostrophe utilisait également la séquence d'échappement d'espace.

Dans cet article, le principal type de chaîne considéré est la chaîne entre guillemets simples.

Principes fondamentaux des expressions régulières

Regex

Considérez cette chaîne :

Ce monde n'est pas vraiment notre maison.

Que le monde soit la sous-chaîne d'intérêt. Ensuite, la grande chaîne (chaîne entière) est appelée la chaîne cible ou simplement la cible. Le «monde» entre guillemets est appelé expression régulière ou simplement regex. Le contenu, le monde, est le modèle, dans ce cas.

Correspondance simple

Dans le code suivant, si le mot « monde » est trouvé dans la cible, nous dirions que le mot a été trouvé.

p=« Ce monde n'est pas vraiment notre maison.
reg='monde'
si [[ $ chaîne= ~$reg ]];alors
chassèrenttrouvé
autre
chassèrentpas trouvé
être

=~ , qui est l'opérateur d'affectation suivi de ~ , est appelé opérateur de liaison. La condition vérifie si le modèle correspond à la chaîne cible. Si une sous-chaîne correspondant au modèle est trouvée dans la cible, l'instruction echo affiche found. S'il n'est pas trouvé, l'instruction echo renvoie introuvable. La sortie de ce code est :

trouvé

Comme le modèle, le monde, se trouve dans la cible. Notez que l'espace de délimitation après [[ et avant ]] a été conservé.

Modèle

Dans le code ci-dessus, « monde » entre guillemets est la regex tandis que le monde lui-même est le modèle. Il s'agit d'un modèle simple. Cependant, la plupart des modèles ne sont pas si simples. Un motif est une caractérisation d'une sous-chaîne à trouver. Et ainsi, le modèle Bash utilise certains métacaractères. Un métacaractère est un caractère sur d'autres caractères. Par exemple, Bash Pattern utilise les métacaractères suivants :

^ $ . * + ? () [] {} |

Une expression régulière peut également être saisie dans la condition entre parenthèses doubles. Mais il ne doit pas être entre guillemets. Donc, dans ce cas, il s'agit littéralement d'un modèle.

Classes de personnages

Crochets

La sortie du code suivant est trouvée, ce qui signifie qu'une correspondance a eu lieu :

p=« Le chat est entré dans la chambre.
si [[ $ chaîne= ~[cbr]à]];alors
chassèrenttrouvé
être

Le motif, [cbr]at correspond à cat, qui commence par 'c', et qui continue et se termine par at. [cbr]at signifie, faites correspondre 'c' ou 'b' ou 'r' suivi de at.

La sortie du code suivant est trouvée, ce qui signifie qu'une correspondance a eu lieu :

p=« La chauve-souris est entrée dans la chambre.
si [[ $ chaîne= ~[cbr]à]];alors
chassèrenttrouvé
être

Le motif, [cbr]at correspond à bat, qui commence par « b », et qui continue et se termine par à. [cbr]at signifie, faites correspondre 'c' ou 'b' ou 'r' suivi de at.

La sortie du code suivant est trouvée, ce qui signifie qu'une correspondance a eu lieu :

p=« Le rat est entré dans la chambre.
si [[ $ chaîne= ~[cbr]à]];alors
chassèrenttrouvé
être

Le motif, [cbr]at correspond à rat, qui commence par « r » et qui continue et se termine par at.

Dans les exemples de code ci-dessus, le programmeur ne sait pas s'il existe un chat, une chauve-souris ou un rat dans la chaîne cible. Mais, il sait que la sous-chaîne commence par 'c' ou 'b' ou 'r', puis continue et se termine par at. Les crochets dans un motif permettent à différents caractères possibles de correspondre à un caractère à une position relative aux autres dans la cible. Ainsi, les crochets contiennent un ensemble de caractères, dont un correspond à une sous-chaîne. Enfin, c'est la sous-chaîne complète qui est mise en correspondance.

Gamme de caractères

Dans le code ci-dessus, [cbr] est une classe. Même si « c » ou « b » ou « r » correspond à un seul caractère, si celui qui suit immédiatement ne correspond pas, le motif ne correspondra à rien.

Eh bien, il y a certaines plages qui formeront une classe. Par exemple, 0 à 9 chiffres forment la classe, [0-9] avec 0 et 9 inclus. Les minuscules « a » à « z » forment la classe [a-z] avec « a » et « z » inclus. Les majuscules « A » à « Z » forment la classe [A-Z] avec « A » et « Z » inclus. D'une classe, c'est l'un des caractères qui correspondrait à un caractère de la chaîne.

Le code suivant produit une correspondance :

si [[ 'ID8id'= ~[0-9] ]];alors
chassèrenttrouvé
être

Cette fois, la cible est une chaîne littérale dans la condition. 8, qui est l'un des nombres possibles dans la plage, [0-9], correspond à 8 dans la chaîne, 'ID8id'. Le code ci-dessus est équivalent à :

si [[ 'ID8id'= ~[0123456789] ]];alors
chassèrenttrouvé
être

Ici, tous les nombres possibles ont été écrits dans le motif, il n'y a donc pas de tiret.

Dans le code suivant, une correspondance est obtenue :

si [[ 'ID8iD'= ~[a-z] ]];alors
chassèrenttrouvé
être

La correspondance est entre le « i » minuscule de la plage, [a-z], et le « i » minuscule de la chaîne cible, « ID8iD ».

N'oubliez pas : la gamme est une classe. La classe peut faire partie d'un modèle plus large. Ainsi, dans un motif, le texte peut être devant et/ou après la classe. Le code suivant illustre cela :

si [[ 'ID8id est l'identifiant'=~ Identifiant[0-9]identifiant ]];alors
chassèrenttrouvé
être

La sortie est : trouvée. « ID8id » du modèle correspond à « ID8id » dans la chaîne cible.

Négation

La correspondance n'est pas obtenue à partir du code suivant :

si [[ '0123456789101112'= ~[^0-9] ]];alors
chassèrenttrouvé
autre
chassèrentpas trouvé
être

La sortie est :

pas trouvé

Sans ^ devant la plage, entre crochets, le zéro de la plage aurait correspondu au premier zéro de la chaîne cible. Ainsi, ^ devant une plage (ou des caractères facultatifs) annule la classe.

Le code suivant produit une correspondance car la condition est la suivante : correspond à tout caractère non numérique n'importe où dans la cible :

si [[ 'ABCDEFGHIJ'= ~[^0-9] ]];alors
chassèrenttrouvé
autre
chassèrentpas trouvé
être

La sortie est donc : found .

[^0-9] signifie un non-chiffre, donc [^0-9] est la négation de [0-9] .

[^a-z] signifie une lettre non minuscule, donc [^a-z] est la négation de [a-z] .

[^A-Z] signifie une lettre non majuscule, donc [^A-Z] est la négation de [A-Z] .

D'autres négations sont disponibles.

Le point (.) dans le motif

Le point (.) dans le motif correspond à n'importe quel caractère, y compris lui-même. Considérez le code suivant :

si [[ '6759WXY.A3'= ~ 7.9W.Y.A]];alors
chassèrenttrouvé
être

La sortie du code est trouvée car les autres caractères correspondent. Un point correspond à « 5 » ; un autre point correspond à « X » ; et le dernier point correspond à un point.

Alternance correspondante

Considérez cette phrase pour une chaîne cible :

La cage a des oiseaux de différents types.

Quelqu'un voudra peut-être savoir si cette cible a un pigeon, un paon ou un aigle. Le code suivant peut être utilisé :

p='La cage a des paons de différents types.'
si [[ $ chaîne=~ pigeon|paon|Aigle]];alors
chassèrenttrouvé
autre
chassèrentpas trouvé
être

La sortie est trouvée. Le métacaractère de l'alternance, | a été employé. Il peut y avoir deux, trois, quatre alternatives et plus. Ce qui correspond dans ce code est « paon ».

Regroupement

Dans le modèle suivant, les parenthèses ont été utilisées pour regrouper les caractères :

une scène (danseur)

Le groupe est ici un danseur de scène entouré des métacaractères ( et ) . (danseur) est un sous-groupe, tandis qu'une scène (danseur) est l'ensemble du groupe. Considérer ce qui suit:

Le (le danseur est génial)

Ici, le sous-groupe ou la sous-chaîne est, le danseur est génial.

Sous-chaînes avec des parties communes

Une partie prenante est une personne ayant un intérêt dans une entreprise. Imaginez une entreprise avec un site Web, stake.com. Imaginez que l'une des chaînes cibles suivantes se trouve dans l'ordinateur :

Le site Web, stake.com est destiné à l'entreprise.;

Il y a la partie prenante.;

La partie prenante travaille pour stake.com. ;

Que l'une de ces chaînes soit la cible. Le programmeur peut vouloir savoir si stake.com ou une partie prenante se trouve dans une chaîne cible. Son modèle serait :

enjeu.com|partie prenante

en utilisant l'alternance.

pieu a été tapé deux fois dans les deux mots. Cela peut être évité en tapant le modèle comme suit :

participation(.com|titulaire)

.com|holder est le sous-groupe dans ce cas.

Remarque : l'utilisation du caractère d'alternance dans ce cas. Stake.com ou une partie prenante seront toujours recherchés. La sortie du code suivant est trouvée :

p=« Le site Web, stake.com, est destiné à l'entreprise. »
si [[ $ chaîne=~ mise(.avec|titulaire) ]];alors
chassèrenttrouvé
être

La sous-chaîne correspondant ici est stake.com.

Le tableau prédéfini BASH_REMATCH

BASH_REMATCH est un tableau prédéfini. Supposons qu'un motif a des groupes. L'ensemble du groupe apparié va dans la cellule pour l'index 0 de ce tableau. Le premier sous-groupe apparié entre dans la cellule de l'index 1 ; le deuxième sous-groupe apparié, va dans la cellule pour l'index 2, et ainsi de suite. Le code suivant montre comment utiliser ce tableau :

p=« Le danseur de scène est venu.
si [[ $ chaîne=~ étape(Danseur) ]];alors
chassèrenttrouvé
être

pourjedans ${!BASH_REMATCH[@]};faire
imprimer '${BASH_REMATCH[i]}, '
terminé
chassèrent

La sortie est :

trouvé
danseur de scène, danseur,

Tout le groupe est danseur de scène. Il n'y a qu'un seul sous-groupe, qui est danseur.

Remarque : l'espace dans le motif a été échappé.

Correspondance d'indépendance majuscule/minuscule

La correspondance, comme expliqué ci-dessus, est sensible à la casse. L'appariement peut être fait indépendamment du cas. Ceci est illustré dans le code suivant :

magasins -snocasematch

p=« Nous aimons la bonne musique. »
si [[ $ chaîne=~ Bien]];alors
chassèrenttrouvé
être

magasins -unocasematch

La sortie est : trouvée. Le modèle est, GoOd. La sous-chaîne correspondante est « bonne ». Notez comment l'option nocasematch a été activée au début du segment de code et désactivée à la fin du segment de code.

Longueur d'une chaîne

La syntaxe pour obtenir la longueur d'une chaîne est :

${#PARAMETER}

Exemple:

p=« Nous aimons la bonne musique. »
chassèrent $ {# chaîne}

La sortie est : 19.

Réduction de chaîne

Les syntaxes pour la réduction de chaîne sont :

${PARAMETER:OFFSET}
${PARAMETER:OFFSET:LENGTH}

où le comptage pour OFFSET commence à partir de zéro.

L'exemple suivant montre comment supprimer les 11 premiers caractères d'une chaîne :

p=« Je danse toujours sur de la bonne musique.
chassèrent $ {str: 10}

La sortie est :

ance à la bonne musique.

Compter pour la LONGUEUR, commence à partir du caractère suivant. Le code suivant montre comment une partie de la chaîne peut être autorisée :

p=« Je danse toujours sur de la bonne musique.
chassèrent $ {str: 10: 6}

La sortie est :

ance t

Les 11 premiers caractères ont été supprimés ; les 6 caractères suivants ont été autorisés et les autres caractères ont été automatiquement supprimés.

Rechercher et remplacer

Lorsqu'une sous-chaîne est trouvée, elle peut être remplacée par une autre sous-chaîne. Les syntaxes pour cela sont :

=${PARAMETRE/MOTIF/REMPLACEMENT}
=${PARAMETRE//MOTIF/REMPLACEMENT}
=${PARAMETRE/MOTIF}
=${PARAMETRE//MOTIF}

Pour la première syntaxe avec une seule barre oblique, seule la première correspondance est remplacée. Exemple:

p=« Il y a un rat, une chauve-souris et un chat dans la chambre.
droit=${str/[cbr]at/grosse vache}
chassèrent $ chaîne
chassèrent $ ret

La sortie est :

Il y a un rat, une chauve-souris et un chat, dans la chambre.
Il y a une grosse vache, une chauve-souris et un chat, dans la chambre.

Pour la deuxième syntaxe avec des doubles barres obliques, toutes les occurrences de la correspondance sont remplacées. Exemple:

p=« Il y a un rat, une chauve-souris et un chat dans la chambre.
droit=${str//[cbr]at/grosse vache}
chassèrent $ chaîne
chassèrent $ ret

La sortie est :

Il y a un rat, une chauve-souris et un chat, dans la chambre.
Il y a une grosse vache, une grosse vache et une grosse vache, dans la chambre.

Pour la troisième syntaxe avec une seule barre oblique, il n'y a pas de remplacement pour la première et la seule correspondance.

De plus, la première sous-chaîne trouvée est supprimée. Exemple:

p=« Il y a un rat, une chauve-souris et un chat dans la chambre.
droit=${str/[cbr]at}
chassèrent $ chaîne
chassèrent $ ret

Pour la quatrième syntaxe avec des doubles barres obliques, il n'y a pas de remplacement pour toutes les correspondances. De plus, toutes les sous-chaînes trouvées sont supprimées. Exemple:

p=« Il y a un rat, une chauve-souris et un chat dans la chambre.
droit=${str//[cbr]at}
chassèrent $ chaîne
chassèrent $ ret

La sortie est :

Il y a un rat, une chauve-souris et un chat, dans la chambre.
Il y a un , un et un , dans la chambre.

Conclusion

Afin de vérifier si une chaîne a une sous-chaîne dans Bash, le Pattern Matching doit être utilisé. La correspondance de modèle n'a pas seulement lieu dans la condition de doubles crochets, [[ . . . ]]. Elle peut aussi avoir lieu en développement de paramètres, avec son ${. . .}. Avec l'expansion des paramètres, il est possible d'obtenir une sous-chaîne par index.

Ce qui a été présenté dans cet article sont les points les plus critiques dans le Pattern Matching. Il y en a plus! Cependant, ce que le lecteur devrait étudier ensuite, c'est l'extension de nom de fichier.