[gull] Script rechercher-remplacer
Claude Paroz
paroz at email.ch
Thu Jun 16 23:13:01 CEST 2005
Le jeudi 16 juin 2005 à 09:48 +0200, Marc SCHAEFER a écrit :
> On Wed, Jun 15, 2005 at 08:41:08PM +0200, Claude Paroz wrote:
> > Mais mon code n'est justement pas complet, car il ne contient pas la
> > partie interactive qui s'arrête à chaque remplacement possible pour
> > demander à l'utilisateur s'il souhaite effectuer le remplacement ou non.
> > C'est là que je bloque...
>
> Effectivement, les commandes de base ne prévoient pas cela.
>
> De toutes les solutions possibles, la piste Perl me semble la meilleure
> car le language intègre les regexps et est raisonnablement
> multiplateforme.
>
< SNIP >
Merci beaucoup Marc pour ton script Perl. Je le retiens !
J'ai finalement persévéré dans la voie du script Bash, et je suis
finalement arrivé à quelque chose de pas trop mal pour moi, même si ce
n'est probablement pas la meilleure façon :
PATTERN="\<indexterm\>\<primary\>&\<\/primary\>\<\/indexterm\>"
FILESTOSCAN="en/*.xml"
for f in `grep -il $1 $FILESTOSCAN`
do
echo "Find/Replace in file $f"
touch $f.tmp
i=1
# loop for every line of the file
while [ `wc -l $f | cut -d" " -f1` -ge $i ]
do
# read a line in the file
line=`sed -n ''$i's/.*/&/p' $f`
newline=$line
while [ -n "`echo $line | grep $1`" ]
do
echo -e
"\n-------------------------------------------------\nLine $i :"
echo $line | grep --colour=auto $1
echo -e "\nDo you want to index the first term '$1' in this
line ? [y-n]"
read answer
if [ "$answer" == "y" ]
then
# replace term and place newline in variable
newline=`printf "$newline\n" | sed -n
's/'$1'/'$PATTERN'/1p'`
fi
# replace term with xxx in the line for catching second
occurrence in next loop
line=`echo $line | sed -n 's/'$1'/xxx/1p'`
done
# write the line in the new file
printf "$newline\n" >> $f.tmp
i=`expr $i + 1`
done
mv $f.tmp $f
done
Merci pour les tuyaux.
Claude
More information about the gull
mailing list