parcours liste de fichier et remplacer une chaine specfique

parcours liste de fichier et remplacer une chaine specfique - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 15-09-2005 à 17:11:59    

Bonjour,
 
Je dois faire un script shell (qui doit bien évidemment tourner demain matin à 9h00 chez mon client) qui réponds aux spec suivantes :
 
1. recherche récursive dans une arborescence tous les fichiers possedant un extension précise (ex. *.aze)  
 
2. une fois cette liste de fichier obtenu, il faut parcourir tous les fichiers à la recherche de chaine de caractère (lignes) du type suivant (en gras figurent les caractéristiques communes à toutes les lignes):
 
blablabla : constant := (bliblibli'LAST + blobloblo)
 
3. et la remplacer par (en gras les changements par rapport à la ligne initiale:
 
blablabla : constant := (integer(bliblibli'LAST) + blobloblo)
 
4. remplacer les anciens fichiers par les nouveaux fichiers ainsi obtenu tout en conservant les anciens avec l'extension *.bak
 
 
Merci pour vos réponses,
 
Ps : j'ai réussi trouver un embryon de solution mais maintenant je sèche...
 

Reply

Marsh Posté le 15-09-2005 à 17:11:59   

Reply

Marsh Posté le 15-09-2005 à 17:22:04    

Postes déjà ce que tu as trouvé
Les gens, ici, ne te feront pas un truc emballé prêt à être posté
On préfère les accompagner et les aider à trouver la soluce eux même :)
Donc si tu as, même juste un embryon, postes  et on te dira ce qu'on en pense, les pistes que tu peux suivre etc ...  :jap:


---------------
« Ce qui ne vous tue pas vous rend plus fort » F. Nietzsche | « Vise_ la Lune. Si tu rates, au pire, t'es dans la merde » Un poète disparu dans le cercle
Reply

Marsh Posté le 15-09-2005 à 17:57:19    

En fait pour obtenir la liste des sources j'ai fait un find . -name  "*.aze" que j'ai pipé dans un fichier liste_files.txt.
 
C'est ce fichier que je veux ensuite parcourir en lisant chaque ligne, copiant le fichier *.aze en *.bak, ouvrant le fichier *.aze indiqué par la ligne. -- ca je ne sais pas faire.
 
Ensuite parcourir le fichier *.aze ligne à ligne à la recherche du mot constant immédiatement suivant des symboles ":=" aux espaces près, vérifier que sur cette ligne figure la chaine 'LAST et si c'est le cas remplacer bliblili'LAST par integer(bliblibli'LAST) -- ca je ne sais pas faire non plus.
 
une idée serait de positionner un flag à 0 avant chaque fichier et l'incrémenter dès que l'on rencontre la modification à effectuer. Si ce flag est encore à zéro une fois le fichier *.aze, on efface le fichier *.bak.
 
je connais les commande pour copier et effacer les fichiers mais je ne connais pas les commandes de manipulations de fichiers en shell ni de recherche de chaines et de remplacement de ces dernières.
 
Je sais bien que vous n'allez me livrer un truc tout prêt mais c'est super important pour mon taff et c'est pour demain...
 
Merci pour toute l'aide que vous pourrez m'apporter...
 

Reply

Marsh Posté le 15-09-2005 à 20:43:58    

Voila le script que j'ai fait, pour l'instant. Il me manque toute la partie de recherche des expressions et leur remplacement...
 
Maintenant j'ai vraiment besoin d'aide... HELP ME... HELP ME
 
 
#!/bin/sh
 
 
# Get the list of specification files
 
find . -name "*.ads" > files_list.txt
 
# Get the number of source_files.
nb_source_files=`cat files_list.txt | wc -l | sed "s/[  ]//g"`
 
echo "Number of source_files to be analysed : $nb_source_files"
echo ""
echo ""
 
# initialize number of source_files already analyzed
nb_source_files_analysed=0
 
while [ $nb_source_files_analysed -lt $nb_source_files ]; do
 
   
    infos_line=""  
 
    while [ "x$infos_line" = "x" ]; do
        nb_source_files_analysed=`expr $nb_source_files_analysed + 1`
        infos_line=`head -$nb_source_files_analysed "files_list.txt" | tail -1`
        infos_line=`echo $infos_line | sed "s/[         ]*#.*//"`
    done
 
    source_file=`echo $infos_line | awk '{print $1}'`
 
#    echo "NEXT file to analyse is $source_file ($nb_source_files_analysed / $nb_source_files)"
#    echo ""
 
    files=$source_file
 
    # Create the backup file
    cp $files $files.bak
 
    # Compute the number of line of the file to analyse
    nb_line_to_analyse=`cat "$files" | wc -l | sed "s/[  ]//g"`
 
    echo "Number of line to analysed in "$files" : $nb_line_to_analyse"
 
    modify_flag=0
 
    echo "Modify_flag for $files is equal to $modify_flag"
 
 
    # Search expression like blabla : constant := (blibli'LAST + bloblo)
    # Then replace it by blabla : constant := (integer(blibli'LAST) + bloblo)
    # if some modification has been performed then the previous flag is incremented.
     
    ...MISSING CODE....  C'est vraiment ici que j'ai besoin d'aide

 
 
   # if no modification then the backup file is destroyed.
   if [ $modify_flag -eq 0 ];
   then
     echo "No modification has been made in "$files""
     rm -f $files.bak
   
   fi
 
   echo ""
done

Reply

Marsh Posté le 19-09-2005 à 02:02:26    

totolle a écrit :

Voila le script que j'ai fait, pour l'instant. Il me manque toute la partie de recherche des expressions et leur remplacement...
 
Maintenant j'ai vraiment besoin d'aide... HELP ME... HELP ME
 
...


Je pense qu'il y a moyen de le faire en une ligne...

find -type f -name '*.ads' | xargs perl -i.bak -pe 's/(.*? : constant := )\\((.*?''LAST)( \\+ .*?)\\)/$1(integer($2)$3)/g'


En gros, le find cherche les fichiers concernés, xargs demande à perl de traiter ces fichiers un par un, l'option -i.bak de perl demande de modifier directement les fichiers et d'en faire une sauvegarde avec le suffixe .bak, l'option -p permet de restituer toutes les lignes des fichiers traités, l'option -e demande d'exécuter le code qui suit entre guillemets, le code entre guillemets ne contenant qu'une expression rationnelle pour remplacer le motif qui nous intéresse par la forme voulue...
Maintenant, il faut voir si l'expression régulière correspond bien à ce que tu veux...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed