Edit 25/07/2009 :
Oubliez tout ce que je dis dans la suite de cet article, c’est que de la merde. Y’a une façon bien plus simple pour traiter les chaînes de caractères. (et bien plus autistique, comme le veut le K-shell).
Le fabuleux, et très explicite opérateur « pourcent-pourcent » permet de supprimer des trucs à la fin. On peut l’utiliser avec le caractère *, signifiant « le plus de conneries possibles ». Ça donne un truc comme ça:
CHAINE="GrosNichonsEtRobeRouge"
AVANT_CHAINE=${CHAINE%%Nichons*}
echo ${AVANT_CHAINE}
-> ça renvoie "Gros"
Et l’incommensurable opérateur dièse-dièse vire des trucs au début.
APRES_CHAINE=${CHAINE##*Nichons}
echo ${APRES_CHAINE}
-> ça renvoie "EtRobeRouge"
Pour récupérer une info entre deux « Nichons », procédez par étapes successives. Non, on peut pas l’avoir d’un seul coup, oui c’est de la merde. Mais c’est du K-shell.
Supposons que vous vouliez récupérer le mot « Poilus », dans la chaîne de caractère : « GrosNichonsRougeNichonsPoilusNichonsPoire ». (Je suppose ce que je veux et ne m’embêtez pas).
CHAINE="GrosNichonsRougeNichonsPoilusNichonsPoire"
AVANT_CHAINE_1=${CHAINE%%Nichons*}
-> AVANT_CHAINE_1 contient "Gros"
CHAINE_2=${CHAINE##${AVANT_CHAINE_1}Nichons}
-> CHAINE_2 contient "RougeNichonsPoilusNichonsPoire"
AVANT_CHAINE_2=${CHAINE_2%%Nichons*}
-> AVANT_CHAINE_2 contient "Rouge"
CHAINE_3=${CHAINE_2##${AVANT_CHAINE_2}Nichons}
-> CHAINE_3 contient "PoilusNichonsPoire"
AVANT_CHAINE_3=${CHAINE_3%%Nichons*}
echo ${AVANT_CHAINE_3}
-> ça renvoie "Poilus" et c'est ce qu'on voulait.
En plus ça s’exécute plus vite que des sed ou des grep, car ça ne crée pas de sous-processus.
Je tiens à remercier mon collègue Pied-Agile, qui m’a fait part de cette astuce. Comme quoi ça peut servir d’avoir dans son entourage un gars qui a tout vu, tout entendu et tout fait, et qui aime à étaler son savoir jusqu’au fond de ta gorge.
Voilà, c’est pas la peine de lire la suite de l’article. Il sert à rien. Je suis un échec. Je suis un échec. Je suis un échec. Je suis un échec. Je suis un échec.
Fin edit
Aujourd’hui, mon collègue Monsieur Vêtements est venu me poser une question toute conne sur ce langage de programmation d’autiste qu’est le Korn shell.
comment
découper
une chaîne
de
caractère
en utilisant
une
sous-chaîne
comme
délimiteur
J’ai bidouillé et cherché sur internet pendant presque une heure, avant de trouver une solution toute simple, utilisant des instructions que je connais depuis 10 millions d’années. Alors soit c’est moi qui suis très con, soit personne n’utilise le Kshell pour faire des trucs de ce genre, soit personne n’utilise le Kshell du tout. Mais ça m’a suffisamment énervé d’avoir mis autant de temps à trouver pour que j’ai eu envie d’en faire un article, et pour montrer au passage que parfois les solutions se trouvent en prenant le problème à l’envers, en particulier avec les langages de programmation d’autiste, et putain c’est quoi cette phrase à rallonge, faut peut être que je mette un « . » là
.
J’en reviens pas d’être toujours autant capable d’écrire des trucs aussi pas drôles. Ce genre de blague on le fait au collège normalement. Hahaha. Point. Hahaha. Bon allez, on enchaîne [de caractère].
Au fait, j’ai rien contre les autistes. Mais c’est juste que c’est à la mode de dire qu’un truc est « d’autiste » quand sa compréhension nécessite un état d’esprit bizarre.
<ici, une photo de sexe avec des autistes?>
Le problème
Vous avez une variable dont la valeur est, au hasard: « GrosNichonsEtRobeRouge »
Mettons que la sous-chaîne de délimitage soit « Nichons ». Vous voulez donc récupérer d’une part le mot « Gros » et d’autre part « EtRobeRouge ».
Les solutions que j’aurais trouvées cools
Je m’étais sottement dit qu’il existait une instruction pour découper une chaîne en morceau, et récupérer, soit la liste des bouts, soit le nième bout.
L’instruction « cut » permet cela. Sauf que le délimiteur ne peut être qu’un caractère tout simple. (Enfin c’est ce que j’ai cru comprendre en lisant leur man d’autiste).
Ou alors j’aurais pu faire ça en deux étapes. Une première instruction me donne l’index du mot « Nichons » dans ma chaîne, puis je récupère les caractères se trouvant avant cet index, et après l’index + la taille du mot Nichons.
Mais pour choper l’index d’une chaîne, c’est pas si évident que ça.
J’avais bien trouvé ce truc là (http:// www. unix.com/shell-programming-scripting/44960-using-awk-shell-script-extract-index-substring-parent-string.html). Ça utilise l’instruction « awk », ça semble un peu compliqué, mais pas si mal.
Sauf que la commande à exécuter n’est pas la même selon qu’on est sous Solaris ou sous autre chose. Ça me tue la gueule qu’un traitement aussi simple et aussi stupide soit dépendant de l’OS. Je dis merde. Bande de sales cons.
La solution que j’y avais pas pensé
J’ai bien évidemment oublié l’adresse du site où elle était expliquée. Tant pis.
Ça marche avec une commande sed toute conne. D’habitude, on s’en sert pour effectuer des changements ou des suppressions sur toutes les lignes d’un fichier. Mais il faut pas oublier qu’on peut aussi l’utiliser sur une variable à la con.
Et au lieu de dire « je veux récupérer ce qu’il y a avant ma sous-chaîne de délimitage » il faut se dire, à l’enverement: « je dois enlever ce qu’il y a après, ainsi que la sous-chaîne elle-même. »
Ce qui nous donne un truc comme ça:
CHAINE="GrosNichonsEtRobeRouge"
AVANT_CHAINE=`echo $CHAINE | sed -e "s/Nichons.*//"`
echo $AVANT_CHAINE
Et vous récupérez « Gros »
Pour ceux qui connaissent pas la fabuleuse syntaxe psychologiquement torturée du Kshell, je vous laisse rien comprendre à ce que j’écris, et vous documentez par vous-même, ou pas. Pour expliquer en une phrase: on remplace le terme « Nichons + n’importe quoi » par rien du tout.
Et pour choper ce qu’il y a après, c’est pareil mais dans l’autre sens:
CHAINE="GrosNichonsEtRobeRouge"
APRES_CHAINE=`echo $CHAINE | sed -e "s/.*Nichons//"`
echo $APRES_CHAINE
Et ça vous sort: « EtRobeRouge »
Les éventuels bouts de « Nichons » se trouvant avant ou après le délimiteur ne sont pas détectés, et c’est tant mieux. Par exemple, si CHAINE vaut « PetitNiichonsGrosNichonsEtRobeRouge », alors AVANT_CHAINE aura pour valeur: « PetitNiichonsGros ». Ça aurait fait pareil avec « Nichon » sans S, ou « ichons » sans N, ou tout autre truc mal écrit.
Y’a pas de Nichons
Si le mot « Nichons » n’est pas présent dans la chaîne de départ, alors AVANT_CHAINE et APRES_CHAINE vaudront pareil que CHAINE. C’est pas forcément pratique. Si ça vous plaît pas, vérifiez préalablement que le délimiteur est bien présent en faisant un petit
echo $CHAINE | grep "Nichons"
Y’a trop de Nichons
Si le mot Nichons est présent plusieurs fois dans la chaîne de départ, ce sera un peu bizarre. Le point-étoile de l’expression régulière du sed essaye de prendre le plus de trucs possibles. Donc pour AVANT_CHAINE vous récupérez ce qu’il y a avant le premier « Nichons », et pour APRES_CHAINE ce qu’il y a après le dernier « Nichons ». Pour avoir le milieu, il faut procéder par étapes successives: on récupère la première partie et le premier Nichons, et on enlève tout ça de la chaîne. Puis on prend la partie suivante, et ainsi de suite.
Si vous savez à l’avance combien y’a de nichons, vous pouvez récupérer directement le morceau que vous voulez:
CHAINE="GrosNichonsRougeNichonsPoilusNichonsPoire"
POS_3=`echo $CHAINE | sed -e "s/.*Nichons.*Nichons\(.*\)Nichons.*/\1/"`
echo $POS_3
Et ça vous répond « Poilus »
Dans le sed, mettez les antislash-parenthèses à la position du morceau que vous voulez choper.
Blablabla
Et vous savez quoi? Ça marche même sur les Mac. Youpi!
J’en profite pour dire que sur les claviers bizarres du Mac le caractère « | » se fait avec la combinaison alt + shift + L. Encore un truc d’autiste.
Ce caractère s’appelle un pipe, (prononcer païpeu en tordant la lèvre de travers pour vous donner un côté dragueur), ce qui me permet de transitionner vers la suite.
Les mots rigolos du langage informatique
C’est bien connu, les informaticiens connaissent rien aux trucs de sexe. Du coup, ils utilisent des mots dont ils ne se rendent même pas compte que c’est une cochotation (= une connotation cochonne).
On vient donc de voir le pipe, d’autant plus rigolo que la forme du caractère évoque l’objet en lui-même, en érection. Ho ho ho.
Mais vous avez aussi le bit. Hahaha!!! BITE!!! Hahaha!!! Sans oublier le « byte », qui ne vaut pas forcément 8 bits, attention!!! (http:// fr.wikipedia.org/wiki/Byte)
Le bool (variable booléenne). Haha. Eh les geek, on se mate un film de bool?
Ah tiens c’est marrant, tous ces mots rigolos étaient féminins au départ, et pour entrer dans le langage informatique, ils ont dû être masculinisés. Une pipe -> un païpe. Une bite -> un bit. Une boule -> un bool.
Quand je vous le disais que ce milieu d’autistes manque de nanas. Où soooonnnt les feeeeeeeemmes??? Tu tulu tu lulu.
Bon, je continue.
Le Mac. C’est un ordinateur. Mais c’est aussi un « DRH en plus-beau-métier-du-monde ». Et vive le commerce de proximité!
Pour les zoophiles, il y a bien sur la souris.
En moins fun, mais un peu quand-même, on a le « short ». (utilisé dans le langage C pour déclarer des variables numériques pas trop longues).
Et bien sûr, on s’y attendait tous, il arrive, le voilà:
LE STRING!!!
Oui, l’image montre un maillot-de-bain-string et pas un vêtement-string. Mais je fais ce que je veux.
Et parfois, on entend même parler de « bitstring ». Ça doit être l’équivalent d’un god ceinture.
En parlant de mots rigolos, j’ai toujours trouvé ça absolument génial que le mot « God » désigne en même temps « Dieu » et le … ben, le gode quoi!!! Oh my god! Hahahaha. Et c’est une blague qu’on peut faire que en français. Les angliches l’auront jamais celle-là. Bien fait!
Je n’ai recensé que les trucs sessuels, mais il y en a plein d’autres (http:// www. presse-citron.net/comment-l-informatique-a-donne-un-nouveau-sens-aux-mots).
Et pis tiens:
. final
Ha ha ha ha! Je suis diabolique!
<blague débile sur le fait que comme je viens de rajouter une phrase après le point final il faudrait que je remette un point, et pis je remettrais une phrase, et je remettrais un point, ainsi de suite jusqu’à l’infini.>