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

Publié: 2022-09-21
Ordinateur portable Linux affichant une invite bash
fatmawati achmad zaenuri/Shutterstock.com

Parfois, dans les scripts Linux, vous souhaitez savoir si une chaîne de texte contient une chaîne spécifique plus petite. Il existe de nombreuses façons de procéder. Nous vous montrons quelques techniques simples et fiables.

Pourquoi est-ce utile ?

La recherche d'une chaîne pour une sous-chaîne plus petite est une exigence courante. Un exemple serait de lire du texte à partir d'un fichier ou d'une entrée humaine et de rechercher dans la chaîne une sous-chaîne spécifique afin que votre script puisse décider quoi faire ensuite. Il peut s'agir de rechercher une étiquette ou un nom de périphérique dans un fichier de configuration ou une chaîne de commande dans une ligne d'entrée d'un utilisateur.

Les utilisateurs de Linux ont la chance de disposer d'un certain nombre d'utilitaires pour manipuler du texte. Certains sont intégrés au shell Bash, d'autres sont fournis en tant qu'utilitaires ou applications autonomes. Il y a une raison pour laquelle les systèmes d'exploitation dérivés d'Unix sont richement servis avec des capacités de manipulation de chaînes.

Comment manipuler des chaînes dans Bash sous Linux
CONNEXION Comment manipuler des chaînes dans Bash sous Linux

Certaines choses qui semblent être des fichiers ne sont pas de simples fichiers. Ce sont des fichiers spéciaux représentant 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, naturellement - et dans certains cas y écrire, mais ce ne sont pas des fichiers ordinaires.

Le texte est également utilisé comme entrée et sortie pour les commandes dans une fenêtre de terminal. Cela permet la redirection et la canalisation de l'entrée et de la sortie. Cette fonctionnalité sous-tend la possibilité d'enchaîner des séquences de commandes Linux, en transmettant la sortie d'une commande comme entrée à la suivante.

Indépendamment de ses origines, la recherche dans le texte que nous recevons d'un mot significatif, d'une commande, d'une étiquette ou d'un autre indicateur fait partie intégrante du traitement des données textuelles. Voici une collection de techniques simples que vous pouvez inclure dans vos propres scripts.

Trouver des sous-chaînes avec Bash Builtins

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

Copiez ce script dans un éditeur et enregistrez-le dans un fichier appelé "double.sh".

 #!/bin/bash

if [[ "singe" = *"clé"* ]] ; alors
  echo "la clé est dans le singe"
autre
  echo "la clé n'est pas dans le singe"
Fi 
Comment utiliser les tests conditionnels à double crochet sous Linux
CONNEXION Comment utiliser les tests conditionnels à double crochet sous Linux

Vous devrez rendre le script exécutable avec la commande chmod . Il s'agit d'une étape toujours nécessaire pour rendre un script exécutable. Vous devrez le faire chaque fois que vous créerez un fichier de script. Remplacez le nom du script approprié dans chaque cas.

 chmod +x double.sh 

rendre un 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 devant ou derrière, le test renverra vrai.

Dans notre exemple, il y a des caractères devant la sous-chaîne. Ceux-ci sont accompagnés du premier astérisque. Il n'y a pas de lettres derrière la sous-chaîne mais, comme un astérisque ne correspond pas non plus à aucun caractère, le test réussit quand même.

Pour plus de flexibilité, nous pouvons modifier notre script pour gérer des variables au lieu de chaînes littérales. Il s'agit du 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 comment cela 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é.

Il s'agit du 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 "Pays de Galles" $capital

Nous appelons notre fonction check_substring en utilisant un mélange de variables et de chaînes littérales. Nous avons utilisé shopt avec son option -s (set) pour définir nocasematch afin de rendre les correspondances insensibles à la casse.

Voici comment ça marche.

 ./double3.sh 

Exécution du script double3.sh

Nous pouvons également utiliser l'astuce consistant à envelopper la sous-chaîne d'astérisques dans les instructions case . Il s'agit de "case.sh".

 #!/bin/bash

shopt -s nocasematch

chaîne="Wallaby"
substring="Mur"

case $chaîne dans

  *$sous-chaîne*)
    echo "$substring a été trouvé dans $string"
    ;;

  *)
    echo "Rien ne correspond : $string"
    ;;
esac

L'utilisation d'instructions case au lieu d'instructions if très longues peut faciliter la lecture et le débogage des scripts. Si vous deviez vérifier si une chaîne contenait l'une des nombreuses sous-chaînes possibles, l'instruction case serait le meilleur choix.

 ./case.sh 

Exécution du script case.sh

La sous-chaîne est trouvée.

Trouver des sous-chaînes avec grep

Au-delà des fonctions intégrées de Bash, le premier outil de recherche de texte que vous utiliserez probablement est grep . Nous pouvons utiliser la capacité innée de grep à rechercher une chaîne dans une chaîne pour rechercher 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 echo pour envoyer la chaîne dans grep , qui recherche la sous-chaîne. Nous utilisons l'option -q (silencieuse) pour empêcher grep d'écrire quoi que ce soit sur la sortie standard.

Comment utiliser la commande grep sous Linux
CONNEXION Comment utiliser la commande grep sous Linux

Si le résultat des commandes entre parenthèses " (...) " est égal à zéro, cela signifie qu'une correspondance a été trouvée. Parce que zéro équivaut à true dans Bash, l'instruction if est satisfaite et la clause then est exécutée.

Voyons quelle est sa sortie.

 ./subgrep.sh 

Exécution du script subgrep.sh

Trouver des sous-chaînes avec sed

Nous pouvons également utiliser sed pour trouver une sous-chaîne.

Par défaut, sed imprime tout le texte qui y est introduit. L'utilisation sed -n empêche cela. Les seules lignes imprimées sont les lignes correspondantes. Cette expression imprimera toutes les lignes qui correspondent ou contiennent la valeur de $substring.

 "/$sous-chaîne/p"

Nous envoyons la valeur de $string dans sed en utilisant une redirection ici, <<< . Ceci est utilisé pour rediriger les valeurs dans une commande dans le shell actuel. Il n'invoque pas un sous-shell comme le ferait un tube.

Comment utiliser la commande sed sous Linux
CONNEXION Comment utiliser la commande sed sous Linux

Le premier -n est le test. Elle renverra true si la sortie de la commande sed est différente de zéro. La seule façon dont la sortie de sed peut être différente de zéro est si une ligne correspondante a été trouvée. Si tel est le cas, $substring doit avoir été trouvé dans $string .

Il s'agit de "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 de $substring afin que la comparaison échoue.

./subsed.sh

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

Arrêtez de chercher, trouvez-le

D'autres outils peuvent trouver des sous-chaînes, tels que awk et Perl , mais un cas d'utilisation simple comme la recherche d'une sous-chaîne ne garantit pas leur fonctionnalité supplémentaire ni la complexité supplémentaire. En particulier, l'utilisation des commandes intégrées de Bash pour rechercher des sous-chaînes est rapide, simple et ne nécessite pas d'outils externes.

CONNEXION: Comment utiliser les instructions de cas dans les scripts Bash