#1 Le 01/09/2009, à 22:27
- bob_le_pecheur
Position d'une sous-chaine dans une chaine de caratères.
chaine="<fis4 e'1 >16 <fis4 e'1 >16 r16<fis4 e'1 >16 r16<fis4 c'2 >16 <fis4 e'1 >16 r16<b2 g'1 >16 r8.g8.3 r16"
Position_de_tempo=$(expr index "$chaine" "tempo")
echo "$Position_de_tempo"
Chez moi, j'obtiens la réponse : 7
....la sous-chaine "tempo", n'est pas présent dans la chaîne pourquoi ça me renvoie 7 au lieu de 0?
Quelqu'un peut-il m'expliquer?
Hors ligne
#2 Le 02/09/2009, à 07:56
- grim7reaper
Re : Position d'une sous-chaine dans une chaine de caratères.
Salut,
C'est tout à fait normal qu'il te renvoie 7. Si tu prends la peine de consulter le man (ce que j'ai fait vu que j'ai très peu de connaissance en bash) tu obtiens ceci :
index chaîne classe_caractère
Renvoie la position de la première occurence du premier caractère appartenant à classe_caractère dans la chaîne.
Si aucun caractère de classe_caractère n'est trouvé dans chaîne, 0 est renvoyé.
Donc en fait, il recherche chacune des lettres de "tempo" et te renvoie l'index de la première trouvée, ici le 'e' à la position 7.
Dernière modification par grim7reaper (Le 02/09/2009, à 07:57)
Hors ligne
#3 Le 02/09/2009, à 08:41
- Totor
Re : Position d'une sous-chaine dans une chaine de caratères.
Bonjour,
$chaine="<fis4 e'1 >16 <fis4 e'1 >16 r16<fis4 e'1 >16 r16<fis4 c'2 >16 <fis4 e'1 >16 r16<b2 g'1 >16 r8.g8.3 r16"
$awk -v search=tempo ' { print index($0,search) } ' <<< "${chaine}"
0
$awk -v search=16 ' { print index($0,search) } ' <<< "${chaine}"
12
EDIT :
Pour un besoin professionnel, j'ai eu besoin de quasiment la même demande, ce qui me fait penser à une solution full bash :
$chaine="<fis4 e'1 >16 <fis4 e'1 >16 r16<fis4 e'1 >16 r16<fis4 c'2 >16 <fis4 e'1 >16 r16<b2 g'1 >16 r8.g8.3 r16"
# recherche de la première position de la chaine "16"
$recherche="16"
$debut_chaine="${chaine%%${recherche}*}"
$position=$((${#debut_chaine}+1))
$echo ${position}
12
Cela retourne l'indice si l'on considère que le 1er caractère se trouve en position 1.
En bash, le premier caractère se trouve en position 0. Donc si c'est pour manipuler la chaine initiale en bash, il faut utiliser position=${#debut_chaine} et non position=$((${#debut_chaine}+1))
Dernière modification par Totor (Le 02/09/2009, à 14:44)
-- Lucid Lynx --
Hors ligne
#4 Le 03/09/2009, à 20:34
- bob_le_pecheur
Re : Position d'une sous-chaine dans une chaine de caratères.
grim7reaper> Effectivement. D'habitude, c'est l'un des premier truc que je fais mais là j'étais tellement persuadé que la commande pouvait rechercher un mot que j'ai même pas eu idée de le vérifier dans la doc.
Totor> Merci à toi, ça va bien me dépanner.
Je teste tout ça et je vous fais un retour.
Hors ligne
#5 Le 04/09/2009, à 09:18
- bob_le_pecheur
Re : Position d'une sous-chaine dans une chaine de caratères.
Sympa les %%, #, etc. Je ne connaissais pas.
J'ai commenté le code, si quelqu'un en a besoin.
#La chaine où l'on cherche un élement.
chaine="<fis4 e'1 >16 <fis4 e'1 >16 r16<fis4 e'1 >16 r16<fis4 c'2 >16 <fis4 e'1 >16 r16<b2 g'1 >16 r8.g8.3 r16"
#L'élement recherché.
recherche="tempo"
#On enleve la valeur de la variable "recherche" et tout ce qui suit dans la variable chaine.
debut_chaine="${chaine%%${recherche}*}"
#On calcule la longueur de la nouvelle chaine. ça longueur +1 correspond à position de l'élement recherché.
position=$((${#debut_chaine}+1))
#Si l'élément recherché ne se trouve pas dans la chaine, la valeur de "position" sera égale à la longeur de la chaine. Il faut donc, dans ce cas, mettre la valeur de "position" à "0".
if [ "$position" -eq $((${#chaine}+1)) ]; then
position="0"
fi
#On affiche le resultat.
echo ${position}
Encore merci.
Hors ligne