Script pour spliter une chaine de caractères
Fermé
Arnaud
-
2 mai 2010 à 13:15
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 3 mai 2010 à 22:34
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 3 mai 2010 à 22:34
A voir également:
- Shell découper chaine caractère
- Caractère ascii - Guide
- Découper pdf - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Découper une video - Guide
1 réponse
mamiemando
Messages postés
33081
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 avril 2024
7 749
Modifié par mamiemando le 2/05/2010 à 14:51
Modifié par mamiemando le 2/05/2010 à 14:51
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
2 mai 2010 à 15:28
[root@MaMachine sbin]# monscript.sh
ingredients=[pomme,poire,bannane]
1 pomme
invalid byte or field list Try 'cut --help' for more information.
3 mai 2010 à 22:34
Bonne chance