Extraction à partir d'une position spécifique
- Extraction depuis le début de la chaîne (l'indexation commence à 0)
Pour compter à partir du début de la chaîne, le format d'extraction est le suivant :
${chaîne: départ :longueur}
Ici, chaîne est la chaîne de caractères à extraire, départ est la position de départ (en comptant à partir de la gauche, le premier caractère est 0, le deuxième est 1, etc.), et longueur est le nombre de caractères à extraire (si omis, cela va jusqu'à la fin de la chaîne).
Par exemple :
adresse="www.example.fr"
echo ${adresse:4:5}<br></br>Résultat : examp À partir de l'indice 4, extraction de 5 caractères.
Autre exemple :
site="a.github.io"
echo ${site:2} # omission du paramètre longueur, extraction jusqu'à la fin<br></br>Résultat : github.io
- Comptage à partir de la droite de la chaîne
Si vous souhaitez compter à partir de la droite de la chaîne, le format est :
${chaîne: 0-départ :longueur}
Par rapport au format 1), celui-ci ajoute simplement 0-, une syntaxe fixe indiquant que le comptage se fait à partir de la droite.
Deux points importants à noter :
- Lors du comptage à partir de la gauche, le numéro de départ est 0 (ce qui correspond à la logique des programmeurs) ; lors du comptage à partir de la droite, le numéro de départ est 1 (ce qui correspond à la logique courante). La direction de comptage diffère, donc le numéro de départ aussi.
- Peu importe d'où on commence à compter, l'extraction se fait toujours de gauche à droite.
Par exemple :
url="www.example.fr"
echo ${url: 0-9:5}<br></br>Résultat : examp En comptant depuis la droite, e est le 9ème caractère
Autre exemple :
url="www.example.fr"
echo ${url:0-9} # omission de la longueur, extraction jusqu'à la fin<br></br>Résultat : example.fr
Extraction à partir d'un caractère spécifique
Cette méthode de extraction ne permet pas de spécifier la longueur de la chaîne, mais seulement d'extraire d'un caractère spécifique jusqu'à la fin. Le Shell peut extraire tous les caractères à droite d'un caractère spécifique, ou tous les caractères à gauche.
1) Utilisation du # pour extraire les caractères de droite
Le symbole # permet d'extraire tous les caractères à droite d'un caractère spécifique, selon le format :
${chaîne#*caractères}
Ici, chaîne représente la chaîne à extraire, caractères est le caractère (ou la séquence de caractères) spécifié, et * est un joker représentant n'importe quelle chaîne de caractères. *caractères ensemble signifie : ignorer tous les caractères à gauche jusqu'à trouver caractères (caractères ne sera pas inclus dans l'extraction).
Regardez cet exemple :
lien="http://www.example.fr/page.html"
echo ${lien#*:}<br></br>Résultat : //www.example.fr/page.html * correspond à n'importe quels caractères jusqu'à trouver : puis extrait tout à droite de :
Les écriturse suivantes donnent le même résultat :
echo ${lien#*p:}
echo ${lien#*tp:}<br></br>Ces deux écritures donnent le même résultat.
Si vous ne voulez pas faire une correspondance floue des caractères à gauche de caractères, vous pouvez omettre le * et faire une correspondance exacte, par exemple :
url="https://www.example.fr/page.html"
echo ${url#https://}<br></br>Résultat : www.example.fr/page.html Correspondance exacte de https:// de gauche à droite
Notez que cette méthode s'arrête à la première occurrence du caractère (sous-chaîne). Par exemple :
url="http://www.example.fr/page.html"
echo ${url#*/}<br></br>Résultat : /www.example.fr/page.html La chaîne url contient trois /, le résultat montre que le Shell s'arrête à la première occurrence de /.
Si vous souhaitez que la correspondance se poursuive jusqu'à la dernière occurrence du caractère (sous-chaîne), vous pouvez utiliser ##, selon le format :
${chaîne##*caractères}
Voyez cet exemple :
#!/bin/bash
url="http://www.example.fr/page.html"
echo ${url#*/} #Résultat : /www.example.fr/page.html
echo ${url##*/} #Résultat : page.html La correspondance de gauche à droite s'arrête après le dernier /. <br></br>
2) Utilisation de % pour extraire les caractères de gauche
Le symbole % permet d'extraire tous les caractères à gauche d'un caractère spécifique, selon le format :
${chaîne%caractères*}
Notez la position du *, car pour extraire les caractères à gauche de caractères et ignorer ceux à droite, le * doit se trouver à droite de caractères. Les autres utilisations de % et # sont similaires, nous n'insisterons pas davantage, voici juste un exemple :
#!/bin/bash
url="http://www.example.fr/page.html"
echo ${url%/*} #Résultat : http://www.example.fr
echo ${url%%/*} #Résultat : http:
Résumé
| Format | Description |
|---|---|
| ${chaîne: départ :longueur} | Extrait longueur caractères de la chaîne, en commençant par le caractère à l'indice départ (en partant de la gauche). |
| ${chaîne: départ} | Extrait de la chaîne à partir du caractère à l'indice départ (en partant de la gauche) jusqu'à la fin. |
| ${chaîne: 0-départ :longueur} | Extrait longueur caractères de la chaîne, en commençant par le caractère à l'indice départ (en partant de la droite). |
| ${chaîne: 0-départ} | Extrait de la chaîne à partir du caractère à l'indice départ (en partant de la droite) jusqu'à la fin. |
| ${chaîne#*caractères} | Extrait tout ce qui se trouve après la première occurrence de *caractères dans la chaîne. |
| ${chaîne##*caractères} | Extrait tout ce qui se trouve après la dernière occurrence de *caractères dans la chaîne. |
| ${chaîne%caractères*} | Extrait tout ce qui se trouve avant la première occurrence de caractères* (en partant de la droite). |
| ${chaîne%%caractères*} | Extrait tout ce qui se trouve avant la dernière occurrence de caractères* (en partant de la droite). |