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";

Répondre à