Le Jeudi 19 D�cembre 2002 21:03, jipe a �crit :
> un peu en r�ponse � christophe qui trouve des $IFS partout ... ;-)
>
> $IFS est le s�parateur de champ interne de bash
> le s�parateur peut �tre un ou plusieurs caract�res dont les
caract�res non imprimables.
>
> quelques exemples:
>
> $ IFS=$' \n\t' # le s�parateur par d�faut le plus commun. espace,
saut de ligne ou tabulation.
> $ for i in 1:2:3:4:5 6; do echo $i; done
> 1:2:3:4:5
> 6
>
> l'espace a servi de d�limiteur de champ
>
> $ IFS=: # le s�parateur est ":"
> $ for i in 1:2:3:4:5 6; do echo $i; done
> 1 2 3 4 5
> 6
>
> les ":" ont �t� remplac� par des espaces mais toujours deux champs
>
> $ for i in $(echo 1:2:3:4:5 6); do echo $i; done
> 1
> 2
> 3
> 4
> 5 6
>
> les 5 champs d�limit�s par ":" sont pr�sents. le 5�me contient un
espace qui n'a donc pas �t� consid�r� comme d�limiteur de champ.
>
> on peut aussi �muler un certain nombre de commandes:
>
> $ IFS=$' \t\n'
> $ echo 1:2:3:4:5 6 | cut -d : -f 5
> 5 6
> $ IFS=:; emulcut=($(echo 1:2:3:4:5 6)); echo ${emulcut[4]}
> 5 6
>
> cette commande �mule cut. le 5�me champ de cut (-f 5) est le 5�me
champ de ${emulcut[*]}. le 1er �tant 0 -> le 5�me est donc 4
> � noter qu'on peut trouver explicitement le dernier champ si on ne
sait pas d'avance combien il y en a
>
> $ IFS=:; emulcut=($(echo 1:2:3:4:5 6)); echo
${emulcut[$((${#emulcat[*]}-1))]}
> 5 6
>
> echo ${#emulcat[*]} renseigne sur le nombre de champs. �a a l'air
barbare mais c'est efficace :)
>
> $ IFS=$' \t\n'
> $ echo -e "1 2\n 3\t4\n\t5 6 7\n8" >test.txt
>
> cr�e un fichier texte nomm� test.txt
>
> $ cat test.txt
> 1 2
> 3 4
> 5 6 7
> 8
> $ IFS=; emulcat=$(while read; echo $REPLY; done <test.txt); echo
$emulcat
> 1 2
> 3 4
> 5 6 7
> 8
>
> celle-ci �mule cat. � noter qu'on peut rediriger l'entr�e standard
d'une boucle depuis un fichier. read ne lit pas l'entr�e clavier mais
le fichier.
>
> $ IFS=$' \t\n'
> $ wc -l <test.txt
> 4
> $ head -n 1 test.txt
> 1 2
> $ tail -1 test.txt
> 8
> $ IFS=$'\n'
> $ emul=($(while read; echo $REPLY; done <test.txt))
> $ echo ${#emul[*]} # �mule wc -l
> 4
> $ echo ${emul[0]} # �mule head -n 1
> 1 2
> $ echo ${emul[$((${#emul[*]}-1))]} # �mule tail -1
> 8
>
> on peut ici �muler �galement des pipes avec head et tail et se
promener tranquillement � l'int�rieur d'un fichier. le gros avantage
est que si l'on veut travailler sur des lignes d'un fichier, la
d�finition de $emul remplit les champs une fois pour toute et que
l'on peut consulter ces divers champs sans consommer de ressource.
alors qu'il faudrait relancer un tail, un head ou un wc � chaque
consultation diff�rente.
>
> chacune des commandes ci-dessus est jusqu'� 10 fois plus rapide dans
sa version bash. il ne s'agit donc pas seulement de faire de belles
lignes incompr�hensibles en "pure bash", mais bien d'optimiser au
maximum :)
>
> la prochaine fois, j'explique comment marche mon script anti
d�prime, � moins que quelqu'un veuille s'y coller :)
>
> bye
> jipe
Salut jipe
merci pour la toujours fameuse rubrique
"Le fil a couper le bash" et bonne annee 2003
--
a+
al@in
Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com"