Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1981 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  parcours liste de fichier et remplacer une chaine specfique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

parcours liste de fichier et remplacer une chaine specfique

n°729946
totolle
Posté le 15-09-2005 à 17:11:59  profilanswer
 

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...
 

mood
Publicité
Posté le 15-09-2005 à 17:11:59  profilanswer
 

n°729963
Zzozo
Modérateur
Un peu, passionément, à la fol
Posté le 15-09-2005 à 17:22:04  profilanswer
 

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
n°730007
totolle
Posté le 15-09-2005 à 17:57:19  profilanswer
 

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...
 

n°730103
totolle
Posté le 15-09-2005 à 20:43:58  profilanswer
 

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

n°731927
Toucouch
Posté le 19-09-2005 à 02:02:26  profilanswer
 

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...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  parcours liste de fichier et remplacer une chaine specfique

 

Sujets relatifs
exploitation fichier .PNMinsertion d'une ligne en fin de fichier avec sed
Probleme de fichier zone (Bind9)erreur lors de copie de fichier:"cp ne peut evaluer..."
manipulation de contenu de fichier avec awkmise a jour sinaptic , erreur sur le fichier udev
Fichier contigufichier batch
comment remplacer grub par liloType de fichier pour un driver mac os X
Plus de sujets relatifs à : parcours liste de fichier et remplacer une chaine specfique


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)