Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Bash caractères un par un
Envoyé par: Varsass

Bonjour,

Je cherche depuis un petit moment maintenant et donc je me permets de demander ici au cas ou quelqu'un saurait :

je fais un script pour trier du bazard, et j'aurai besoin de prendre un fichier d'une ligne et de le tranformer en fichier d'une colonne, en gros si j'ai un fichier1 qui contient une ligne avec toto j'aimerai en récupérer un avec 4 lignes : t, o, t, o :

$cat fichier1
toto

$cat fichier2
t
o
t
o

Pour ça je cherche désespérement à faire un for qui me lise les caractères un par un, seulement voilà : un for du genre

for i in "toto"
do
echo $i
done

lis la chaine en une fois, et pas caractères par caractères.


Donc (tout ça pour ça) sauriez vous comment lire une chaine caractères par caractères ?


Poste le Tuesday 24 April 2007 12:18:40
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Fanch

$ TOTO="salut"
$ for i in $( seq ${#TOTO} ) ; do ((a = $i - 1)) ; echo "${TOTO:$a:1}" ; done
s
a
l
u
t

ça y est, je suis un w4rL0rD H4x0r d3 l4 m0R[ !!! ^^D-*

non, en fait je suis tout content parce que je l'ai pondu du premier coup yawning smiley)

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 24 April 2007 13:05:51
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Varsass

ça marche au poil !

Merci merci merci merci

Poste le Tuesday 24 April 2007 14:07:45
Répondre     Citer    
Re: Bash caractères un par un

Plus simple smiling smiley
echo toto|sed -e 's/./&\n/g'


--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Tuesday 24 April 2007 15:22:02
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Fanch

Que non point mon ami ! pour 2 raisons :

1/ Avec cette solution tu vas ajouter une ligne vide à la fin dont on se fout éperdument
2/ Comme je m'y suis fait les crocs dans un précédent thread, le pipe génère un fork implicite qui peut potentiellement être des plus malvenus.

cela dit, c'est joli aussi et c'est certes plus vite tapé :-))

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Tuesday 24 April 2007 17:29:39
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Sve@r

Citation
Fanch
1/ Avec cette solution tu vas ajouter une ligne vide à la fin dont on se fout éperdument
Remplacer "echo" par "echo -n" devrait résoudre le problème...

Citation
Fanch
2/ Comme je m'y suis fait les crocs dans un précédent thread, le pipe génère un fork implicite qui peut potentiellement être des plus malvenus.
Certes... mais comme c'est la base de la programmation shell (pouvoir enchaîner diverses petites commandes les unes à la suite des autres pour faire au final un truc grandiose) je vois mal comment se passer du pipe... ou alors passer par divers fichiers temporaires => Tiens, ça me donne une idée (je tape en live, sans tester mais même si ça ne marche pas du premier coup, les connaisseurs comprendront l'idée)

#!/bin/sh
mknod fifo p
echo toto >fifo &
sed -e 's/./&\n/g' fifo
wait
rm -f fifo

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Thursday 26 April 2007 14:10:19
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Fanch

Certes oui, l'echo -n fonctionne bien (mea culpa, j'aurais dû y penser, pan sur le bec !! X-o ).

ton petit script marche bien mais il faut faire rm -rf pour flinguer la fifo (enfin, on avait compris quand même ;-) ).


Le pipe, je suis tout à fait pour ! et ce pour les mêmes raisons que toi.
Sauf lorsque ledit pipe te sert à énumérer des valeurs sur lesquelles tu boucles car du coup tu génère un fork implicite et que niveau debug/maintenabilité etc ... c'est le bronx.


------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Thursday 26 April 2007 16:00:21
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Mochi-mochi

Salut,

Citation
Fanch
Sauf lorsque ledit pipe te sert à énumérer des valeurs sur lesquelles tu boucles car du coup tu génère un fork implicite et que niveau debug/maintenabilité

Si tu veux de la regexp "sed-like" en un seul processus, tu peux faire un one-line avec Perl:
perl -e '$ARGV[0] =~ s/(\w)/$1\n/g ; print $ARGV[0];' toto
t
o
t
o

Voir même traiter tous tes fichiers en une seule fois:
perl -e 'for (@ARGV) { s/(\w)/$1\n/g ; print "$_";}' toto titi tutu
t
o
t
o
t
i
t
i
t
u
t
u

Poste le Thursday 26 April 2007 18:37:24
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Fanch

ah ouais, pas mal. Faut vraiment qu'un jour je me penche sur perl, ça a l'air d'être royal pour des tâches d'administration !

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Thursday 26 April 2007 21:46:55
Répondre     Citer    
Re: Bash caractères un par un
Envoyé par: Mochi-mochi

Personnellement, je trouve qu'en tant que super-shell, c'est effectivement beaucoup plus indiqué que le Python. D'ailleurs je me suis laissé dire qu'à la base c'est un super-shell.

My 2¢ ;-)

Poste le Friday 27 April 2007 12:15:22
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Bash caractères un par un
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons