Script pour spliter une chaine de caractères
Bonjour, mon problème est certainement très simple à régler mais je n'ai pas de connaissance dans ce domaine. Je dois faire un shell script du type monscript.sh qui recoit en paramètre une variable qui est appelé de la manière suivante : monscript.sh mavariable
Jusqu'à là pas de soucis particuliers. Je souhaite que mon script me sorte quelque chose qui ressamble à cela.
$ monscript.sh "pour faire une tarte au pomme il faut : des pommes , de la farine , du sucre ..."
doit retourner :
des pommes
de la farine
du sucre
...
mon problème c'est que le nombre de variables n'est pas défini et je suppose qu'il faut que que je fasse une boucle tant qu'il y a des variables.
Je vous remercie de votre aide. Bonne week end à tous.
Jusqu'à là pas de soucis particuliers. Je souhaite que mon script me sorte quelque chose qui ressamble à cela.
$ monscript.sh "pour faire une tarte au pomme il faut : des pommes , de la farine , du sucre ..."
doit retourner :
des pommes
de la farine
du sucre
...
mon problème c'est que le nombre de variables n'est pas défini et je suppose qu'il faut que que je fasse une boucle tant qu'il y a des variables.
Je vous remercie de votre aide. Bonne week end à tous.
A voir également:
- Shell découper chaine caractère
- Caractère ascii - Guide
- Classic shell - Télécharger - Personnalisation
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Comment découper un pdf - Guide
1 réponse
Le problème c'est qu'itérer sur le nombre d'arguments ne t'avancera pas à grand chose. Il vaut mieux récupérer la chaîne d'argument via $@ (anciennement $* qu'on évite aujourd'hui d'utiliser). La solution que je vais te proposer n'est peut être pas la plus élégante mais elle à l'air de marcher.
L'idée de la solution que je te propose consiste à découper la chaîne d'abord sur le caractère : de sorte à extraire tout ce qui est derrière ce caractère.
Une fois cette sous-chaine d'ingrédients isolée, on la découpe sur le caractère ','. Chaque tronçon correspond à l'un des ingrédients. On continue jusqu'à ce que la chaîne ingredient soit vide.
Ce qui donne :
En l'état le programme n'est pas tout à fait parfait dans la mesure ou les espaces situés devant et derrière les virgules impactent les chaîne d'ingrédient. La commande tr permet de virer les espaces en plusieurs exemplaires. À toi de voir comment arranger les chaînes "ingredient".
D'autre part, autant ce programme est un peu lourd à écrire en shell, autant avec awk ça se fait vraiment bien (et sans se prendre la tête avec les espaces devant et derrière les virgules).
Bonne chance
L'idée de la solution que je te propose consiste à découper la chaîne d'abord sur le caractère : de sorte à extraire tout ce qui est derrière ce caractère.
Une fois cette sous-chaine d'ingrédients isolée, on la découpe sur le caractère ','. Chaque tronçon correspond à l'un des ingrédients. On continue jusqu'à ce que la chaîne ingredient soit vide.
#!/bin/bash # champ1:champ2 --> on extrait le 2e champ ingredients=$(echo $@ | cut -d':' -f2) echo "ingredients=[$ingredients]" # maintenant on extrait chaque ingrédient ingredient=$(echo $ingredients | cut -d',' -f1) i=1 while [ "$ingredient" != "" ] do echo $ingredient i='expr $i + 1' ingredient=$(echo $ingredients | cut -d',' -f$i) done
Ce qui donne :
(mando@aldur) (~) $ sh plop.sh "pour faire une tarte au pomme il faut : des pommes, de la farine, du sucre ..." ingredients=[ des pommes, de la farine, du sucre ...] des pommes de la farine du sucre ...
En l'état le programme n'est pas tout à fait parfait dans la mesure ou les espaces situés devant et derrière les virgules impactent les chaîne d'ingrédient. La commande tr permet de virer les espaces en plusieurs exemplaires. À toi de voir comment arranger les chaînes "ingredient".
D'autre part, autant ce programme est un peu lourd à écrire en shell, autant avec awk ça se fait vraiment bien (et sans se prendre la tête avec les espaces devant et derrière les virgules).
Bonne chance
[root@MaMachine sbin]# monscript.sh
ingredients=[pomme,poire,bannane]
1 pomme
invalid byte or field list Try 'cut --help' for more information.
Bonne chance