52 votes

Comment déterminer si une chaîne de caractères est une sous-chaîne d'une autre chaîne de caractères en bash ?

Je veux voir si une chaîne de caractères se trouve à l'intérieur une partie d'une autre chaîne.
par exemple :

'ab' in 'abc' -> true
'ab' in 'bcd' -> false

Comment puis-je faire cela dans un conditionnel d'un bash script ?

49voto

TJSoler Points 471

[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]

les parenthèses sont pour le test, et comme il s'agit de doubles parenthèses, il peut y avoir des tests supplémentaires comme =~ .

Vous pouvez donc utiliser ce formulaire de la manière suivante

var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
    echo "pass"
else
    echo "fail"
fi

Edita: corrigé "=~", s'était inversé.

30voto

edwin Points 3659

Vous pouvez utiliser le formulaire ${VAR/subs} donde VAR contient la chaîne la plus grande et subs est la sous-chaîne que vous essayez de trouver :

my_string=abc
substring=ab
if [ "${my_string/$substring}" = "$my_string" ] ; then
  echo "${substring} is not in ${my_string}"
else
  echo "${substring} was found in ${my_string}"
fi

Cela fonctionne parce que ${VAR/subs} est égal à $VAR mais avec la première occurrence de la chaîne subs supprimée, en particulier si $VAR ne contient pas le mot subs il ne sera pas modifié.

12voto

Todd Gamblin Points 101

Utilisation de bash motifs de noms de fichiers (alias motifs "globaux")

substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no    # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no    # no

10voto

Richard Hansen Points 1623

Les deux approches suivantes fonctionneront dans n'importe quel environnement compatible POSIX, et pas seulement dans bash :

substr=ab
for s in abc bcd; do
    if case ${s} in *"${substr}"*) true;; *) false;; esac; then
        printf %s\\n "'${s}' contains '${substr}'"
    else
        printf %s\\n "'${s}' does not contain '${substr}'"
    fi
done

substr=ab
for s in abc bcd; do
    if printf %s\\n "${s}" | grep -qF "${substr}"; then
        printf %s\\n "'${s}' contains '${substr}'"
    else
        printf %s\\n "'${s}' does not contain '${substr}'"
    fi
done

Les deux résultats ci-dessus :

'abc' contains 'ab'
'bcd' does not contain 'ab'

La première solution présente l'avantage de ne pas engendrer un fichier grep processus.

Notez que j'utilise printf %s\\n "${foo}" au lieu de echo "${foo}" parce que echo peut mutiler ${foo} s'il contient des barres obliques inverses.

6voto

Sergiy Kolodyazhnyy Points 97292

Shell instruction case

C'est la solution la plus portable, elle fonctionnera même sur les vieux shells Bourne et Korn Shell.

#!/bin/bash
case "abcd" in
    *$1*) echo "It's a substring" ;;
    *) echo "Not a substring" ;;
esac

Exemple d'exécution :

$ ./case_substr.sh "ab"                                                                                           
It's a substring
$ ./case_substr.sh "whatever"                                                                                     
Not a substring

Notez qu'il n'est pas nécessaire d'utiliser spécifiquement la fonction echo vous pouvez utiliser exit 1 y exit 0 pour signifier le succès ou l'échec.

Ce que nous pourrions faire également, c'est créer une fonction (qui peut être utilisée dans de grands scripts si nécessaire) avec des valeurs de retour spécifiques ( 0 en cas de correspondance, 1 en cas d'absence de correspondance) :

$ ./substring_function.sh                                  
ab is substring

$ cat substring_function.sh                                
#!/bin/sh

is_substring(){
    case "$2" in
        *$1*) return 0;;
        *) return 1;;
    esac
}

main(){
   if is_substring "ab" "abcdefg"
   then
       echo "ab is substring"
   fi
}

main $@

grep

$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"                                    
it's a substring

Cette approche particulière est utile pour les instructions if-else dans les bash . Également très portable

AWK

$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"                                                             
it is a substring

Python

$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring

Rubis

$ ruby -e ' puts "is substring" if  ARGV[1].include? ARGV[0]'  "ab" "abcdef"                                             
is substring

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X