[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