[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