Comment savoir si une chaîne Bash contient une sous-chaîne sous Linux

Comment savoir si une chaîne Bash contient une sous-chaîne sous Linux

Parfois, dans les scripts Linux, vous devez savoir si une chaîne de texte contient une certaine chaîne plus petite. Il existe de nombreuses façons de procéder. Nous allons vous montrer quelques méthodes simples et fiables.

Pourquoi est-ce utile ?

L’exigence habituelle est de trouver une sous-chaîne plus petite dans une chaîne. Un exemple serait de lire du texte à partir d’un fichier ou d’une entrée humaine et de rechercher une sous-chaîne particulière dans une chaîne afin que votre script puisse décider quoi faire ensuite. Il peut s’agir d’une recherche d’étiquette ou de nom de périphérique dans un fichier de configuration, ou d’une recherche de ligne de commande sur la ligne d’entrée de l’utilisateur.

Les utilisateurs de Linux sont dotés de nombreux utilitaires pour travailler avec du texte. Certains d’entre eux sont intégrés au shell Bash, d’autres sont fournis en tant qu’utilitaires ou applications distincts. Il y a une raison pour laquelle les systèmes d’exploitation dérivés d’Unix sont richement équipés de capacités de manipulation de chaînes.

Certaines choses qui semblent être des fichiers ne sont pas que des fichiers. Ce sont des fichiers spéciaux qui représentent des éléments tels que des périphériques matériels et des sources d’informations système. L’abstraction effectuée par le système d’exploitation leur donne l’apparence et les caractéristiques des fichiers. Vous pouvez y lire des informations – sous forme de texte, bien sûr – et dans certains cas y écrire, mais ce ne sont pas des fichiers normaux.

Le texte est également utilisé comme entrée et sortie pour les commandes dans la fenêtre du terminal. Cela permet aux données d’entrée et de sortie d’être redirigées et transmises. Cette fonctionnalité sous-tend la possibilité d’enchaîner des séquences de commandes Linux ensemble, en transmettant la sortie d’une commande comme entrée à la suivante.

Quelle que soit l’origine, la recherche dans le texte reçu d’un mot significatif, d’une commande, d’une étiquette ou d’un autre indicateur fait partie intégrante du travail avec des données textuelles. Voici un ensemble d’astuces simples que vous pouvez intégrer dans vos propres scripts.

Recherche de sous-chaînes avec les fonctions intégrées de Bash

Le test de comparaison de chaînes entre crochets doubles  » [[...]] » peut être utilisé dans ifdes instructions pour déterminer si une chaîne contient une autre chaîne.

Copiez ce script dans un éditeur et enregistrez-le dans un fichier nommé « double.sh ».

#!/bin/bash

si [[ « singe »= * »clé »* ]] ; alors

echo « la clé est dans le singe »

autre

echo « la clé n’est pas dans le singe »

fi

Vous devrez rendre le script exécutable avec la chmodcommande. C’est une étape toujours nécessaire pour rendre n’importe quel script exécutable. Vous devrez le faire chaque fois que vous créerez un fichier de script. Remplacez le nom de script approprié dans chaque cas.

chmod +x double.sh

créer un fichier de script exécutable avec chmod

Exécutons le script.

./double.sh

Exécution du script double.sh

Cela fonctionne parce que l’astérisque  » * » représente n’importe quelle séquence de caractères, y compris aucun caractère. Si la sous-chaîne « clé » se trouve dans la chaîne cible, avec ou sans caractères avant ou après, le test renverra vrai.

Dans notre exemple, la sous-chaîne est précédée de caractères. Ils correspondent au premier astérisque. Il n’y a pas de lettres derrière la sous-chaîne, mais comme l’astérisque ne correspond à aucun caractère, le test réussit toujours.

Pour plus de flexibilité, nous pouvons modifier notre script pour gérer des variables plutôt que des chaînes littérales. C’est le script « double2.sh ».

#!/bin/bash

chaîne= »Singe »

sous-chaîne= »clé »

if [[ $chaîne = *$sous-chaîne* ]] ; alors

echo « $substring a été trouvé dans $string »

autre

echo « $substring n’a pas été trouvé dans $string »

fi

Voyons voir comment ça fonctionne.

./double2.sh

Exécution du script double2.sh

Cela fonctionne de la même manière, avec l’avantage que nous pouvons utiliser des noms de variables au lieu de chaînes littérales. Transformer notre petite solution en une fonction offrira le plus de flexibilité.

C’est le script « double3.sh ».

#!/bin/bash

shopt -s nocasematch

chaîne= »Singe »

sous-chaîne= »Clé »

capital= »Londres »

check_substring()

{

si [[ $1 = *$2* ]] ; alors

echo « $2 a été trouvé dans $1 »

autre

echo « $2 n’a pas été trouvé dans $1 »

Fi

}

check_substring « Singe » »clé »

check_substring $string $substring

check_substring $string « banane »

check_substring "Wales"$capital

Nous appelons notre check_substringfonction en utilisant une combinaison de variables et de chaînes littérales. Nous avons utilisé shopt avec son -soption (set) set nocasematchpour rendre les correspondances insensibles à la casse.

Voici comment ça fonctionne.

./double3.sh

Exécution du script double3.sh

Nous pouvons également utiliser des astérisques autour d’une sous-chaîne dans caseles opérateurs. C’est « case.sh ».

#!/bin/bash

shopt -s nocasematch

chaîne= »wallaby »

sous-chaîne= »mur »

case $chaîne dans

*$sous-chaîne*)

echo « $substring a été trouvé dans $string »

;;

*)

echo « Rien ne correspond : $string »

;;

esac

L’utilisation cased’instructions au lieu de très longues ifpeut faciliter la lecture et le débogage des scripts. Si vous devez vérifier si une chaîne contient l’une des nombreuses sous-chaînes possibles, casel’opérateur est le meilleur choix.

./case.sh

Exécution du script case.sh

Sous-chaîne trouvée.

Trouver des sous-chaînes avec grep

Outre les fonctions intégrées de Bash, le premier outil de recherche de texte dont vous aurez probablement besoin est grep. Nous pouvons utiliser la grepcapacité innée de rechercher une chaîne dans une chaîne pour trouver nos sous-chaînes.

Ce script s’appelle « subgrep.sh ».

#!/bin/bash

string= »pot de bouillie »

sous-chaîne= »crête »

si $(echo $chaîne | grep -q $sous-chaîne); alors

echo « $substring a été trouvé dans $string »

autre

echo « $substring n’a pas été trouvé dans $string »

fi

Le script utilise echopour envoyer une chaîne à grep, qui recherche une sous-chaîne. Nous utilisons l’ -q option (quiet) pour arrêter d’ grepécrire quoi que ce soit sur stdout.

Si le résultat de l’exécution des commandes entre parenthèses  » (...) » est zéro, cela signifie qu’une correspondance a été trouvée. Étant donné que zéro correspond truedans Bash, ifl’instruction est satisfaite et thenla clause est exécutée.

Voyons quelle est sa production.

./subgrep.sh

Exécution du script subgrep.sh

Trouver des sous-chaînes avec sed

Nous pouvons également utiliser sedpour rechercher une sous-chaîne.

Par défaut sed, imprime tout le texte saisi. L’utilisation sed -nempêche cela. Seules les lignes correspondantes sont imprimées. Cette expression imprimera toutes les lignes qui correspondent ou contiennent la valeur de $substring.

"/$substring/p"

Nous transmettons la valeur $stringà sedl’utilisation de la redirection ici <<<. Ceci est utilisé pour rediriger des valeurs vers une commande dans le shell actuel. Il n’appelle pas un sous-shell comme le fait un canal.

Le premier -nest un essai. Il reviendra truesi la sortie sedde la commande est différente de zéro. La seule façon dont la sortie sedpeut être non nulle est de trouver une chaîne correspondante. Si oui, alors il $substringdevrait être trouvé dans $string.

C’est « subsed.sh ».

#!/bin/bash

chaîne= »Suède »

substring= »eden »

if [ -n « $(sed -n « /$substring/p »<<< $string) »] ; alors

echo « $substring a été trouvé dans $string »

autre

echo « $substring n’a pas été trouvé dans $string »

fi

Nous obtenons la réponse attendue lorsque nous exécutons le script.

./subsed.sh

Exécution du script subsed.sh

Nous pouvons tester la logique du script en modifiant la valeur $substringafin que la comparaison échoue.

./subsed.sh

Exécution du script subsed.sh avec une sous-chaîne incompatible

Arrêtez de chercher, trouvé

D’autres outils peuvent trouver des sous-chaînes comme awket , Perlmais un cas d’utilisation simple comme la recherche de sous-chaînes ne garantit pas leur fonctionnalité supplémentaire ou leur complexité accrue. En particulier, l’utilisation des fonctions intégrées de Bash pour trouver des sous-chaînes est rapide, simple et ne nécessite pas d’outils externes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *