SHELL : mise en forme de variable

Bonjour,

J’ai un petit problème avec un script.

J’ai une variable qui contient différentes chaines de caractères les unes à la suite des autres. Ces chaines de caractères sont séparées soir par le caractère [mono]entrer[/mono] soit par le caractère [mono]tabulation[/mono].

J’aimerais pouvoir ranger ma variable dans un tableau à deux dimensions. Il faudrait que la [mono]tabulation[/mono] me sépare chaque colonne du tableau et que le [mono]entrer[/mono] me sépare chaque ligne du tableau.

L’idée par la suite et que je puisse accéder à une chaine de caractère de la sorte tab[x][y] pour ne traiter que celles qui m’intéressent.

Y’a t’il moyen de faire ça avec du bash?

salut,

avec bash, il va falloir être très astucieux, mais ce n’est pas impossible.
Gawk permet de le faire sans grande complication, car les tableaux étant hashés ils ne respectent pas l’ordre d’apparition dans le tableau.

Il faut que tu joues avec IFS cette variable indique quel est le séparateur de chaîne.

Hop hop hop, un POC :

[code]#!/bin/sh

string=$(echo -e “foo\tbar\nFOO\tBAR”)
IFS=’
'
for line in $(printf “$string”)
do
OLD_IFS=$IFS
IFS=" " # voir note
for word in $line
do
printf $word
printf "*"
done
printf "\n"
IFS=$OLD_IFS
done[/code]

Note : Ceci est une véritable tabulation. L’insérer dans le script apr le raccourci Ctrl + V puis Tab.

Lors de l’exécution :

$ ./poc.sh foo*bar* FOO*BAR*

Il ne reste qu’à ajouter des compteurs pour remplir ton tableau, plutôt que d’afficher la variable $word.

EDIT : Pour info, ce script est compatible sh. Par contre, les tableaux n’existent pas en sh, et oblige donc à utiliser bash.
EDIT 2 : Il y a certainement une solution plus jolie à base de read -a -r, mais pas aussi portable que ce script.

[quote=“http://tldp.org/LDP/abs/html/special-chars.html”]…
$’ … ’

Quoted string expansion. This construct expands single or multiple [b]escaped[/b] octal or hex values into ASCII [3] or Unicode characters.

…[/quote]michel@debG53SW:~$ echo $'x\tx' # j'ai encadré par des "x" le caractère de tabulation afin de le rendre visible x x michel@debG53SW:~$ echo -e "x\tx" # le même résultat peut aussi être obtenu avec l'option -e de la commande echo x x michel@debG53SW:~$ printf "x\tx\n" # ou même tout simplement avec la commande /usr/bin/printf x x michel@debG53SW:~$ NOTE : On peut remarquer que la commande [mono]echo[/mono] rajoute automatiquement un caractère de fin de ligne (hexa 0a), ce qui n’est pas le cas avec la commande [mono]printf[/mono] (d’où le “\n” que j’ai ajouté pour le look du retour)

Il est donc possible d’utiliser :

michel@debG53SW:~$ maVarIFS=$'\t' michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C 00000000 09 0a |..| 00000002 michel@debG53SW:~$ maVarIFS=$(printf "\t") michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C 00000000 09 0a |..| 00000002 michel@debG53SW:~$

michel@debG53SW:~$ maVarIFS=$'\x09' # On peut aussi utiliser le point de code unicode du caractère de tabulation (hexa 09) michel@debG53SW:~$ echo "x${maVarIFS}x" x x michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C 00000000 09 0a |..| 00000002 michel@debG53SW:~$

=======
Note aux modérateurs : Merci pour votre réactivité : Ce fil de discussion m’est maintenant visible aussi bien dans la liste des sujets actifs que dans la liste de mes messages :smiley: