[gull] Script rechercher-remplacer

Daniel Cordey dc at mjt.ch
Fri Jun 17 09:13:06 CEST 2005


On Thursday 16 June 2005 23:11, Claude Paroz wrote:

>     # loop for every line of the file
>     while [ `wc -l $f | cut -d" " -f1` -ge $i ]

Maintenant que j'y regarde de plus pret... petits commentaires :

- J'ecrirais plutot :

	while read line
	do
		...
	done <$f

- Une ecriture :

	'wc  -l $f | cut -d" " -f1`

Peut-etre remplacee par :

	$(wc -l <$f)

Remplacer les `` par $() n'a plus l'avantage de performance qu'il avait il y a 
longtemps mais c'est plus lisible (moins de chance de ne pas voir la 
difference entre `et '). Autrement, le fait d'utiliser '<' evite de se 
retrouver avec le nom du fichire que l'on elimine avec le 'cut'



>                 # replace term and place newline in variable
>                 newline=`printf "$newline\n" | sed -n
> 's/'$1'/'$PATTERN'/1p'`

- Pas besoin de preciser '-n', ni de '1p'. Un simple 'sed "s/$1/${PATTERN}/"

Je prefere aussi utiliser les "" dans le cas ou je veux pouvoir 'evaluer' des 
variables a l'interieur. Cela evite les multiples ouvertures/fermetures de 
chaine de carcateres avec les ''. Aussi, j'ai pris l'habitude d'encapsuler 
les variable entre {}, afin de limiter les risques d'erreurs en delimitant 
clairement le nom d'une variable. Par exemple :

X='toto'
XX='titi'

a="$XX"

N'est peut-etre pas forcement ce que l'on veut, mais :

a="${X}X"
b="${XX}"

n'est plus ambigu

>         # write the line in the new file
>         printf "$newline\n" >> $f.tmp
>         i=`expr $i + 1`


printf est couteux ! (en temps...). Un simple 

	echo "${newline" >> ${f}.tmp

Aurait suffit. Mais... le plus couteux dans l'affaire est le '>>'. En effet, 
comme cette commande se trouve dans uen boucle, le shell doit, a chaque 
boucle, ouvrir le fichier, deplacer le curseur a la fin puis refermer le 
fichier. Il est mieux d'encapsuler toute la boucle (exterieur !) dans :

	{
		for ...
		do
			...
			echo "${newline}"
		done
	} > ${f}.tmp

>     mv $f.tmp $f

Peut-etre serait-il judicieux de prendre l'habitude de tester si le fichier 
creer est non vide; ca peut-etre le signe d'un bug (le fait qu'il soit vide). 
Donc :

	test -s ${f}.tmp && mv ${f}.tmp ${f}


dc



More information about the gull mailing list