Forum Programmation.shell aide sur un script

Posté par  .
Étiquettes : aucune
0
13
sept.
2007
bonjour, je suis en train de faire un script shell et je suis debutant donc je galere pas mal ,j'ai deja posté des post car j'ai l'impression d'avoir du mal a chaque ligne , donc je vais vous mettre le script entier pour que vous puissez m'aider a avoir un script correct
[CODE]
#!/bin/bash
#################################
#################################

prefix="OGL_"
tmp0="_tmp0_"
tmp1="_tmp1_"
tmp2="_tmp2_"
tmp3="_tmp3_"
tmp4="_tmp4_"
tmp5="_tmp5_"
end="END"


for file in [^$prefix]* #ici ça ne fonctionne pas, le script s'exécute également sur les fichier commençant par le préfixe
do
echo $file
cp $file $file$tmp0
sed 's/\<\(abs\|dp4\|if\|rep\)\>/\U&/g' $file$tmp0 > $file$tmp1 #ceci fonctionne et a pour effet de passer abs, dp4, if et rep en majuscule
rm $file$tmp0
sed 's/\<texld\>/TEX/g' $file$tmp1 >$file$tmp2 #ici pas de probleme
rm $file$tmp1
sed 's/\/\//#/g' $file$tmp2 >$file$tmp3 #ici tout va bien , je remplace // par #
rm $file$tmp2
sed 's/\<\,\|\,\ \>/\,\ /g' $file$tmp3 >$file$tmp4 #ici par contre ça ne fonctionne pas , je voudrais remplacer les virgules (",") et virgule+espace(", ") en virgule+espace (", ")
rm $file$tmp3
sed -i $file$tmp4 "s/.*/&'$end'/g" #fonctionne pas non plus , je veut ajouter "END" a la fin du fichier
cp $file$tmp4 $prefix$file
rm $file$tmp4


done
[/CODE]

j'aimerais aussi ajouter un point virgule à la fin de chaque ligne mais avant les commentaires qui commence par un #

y a t'il une façon pour éviter autant de fichiers temporaires à supprimer ensuite ?

dans mes fichier à traiter j'ai des variable r , que je nomme r0, r1, r2,....,r15, ...., rn...
est il possible de compter le nombre de variable r différente pour ensuite les déclarer automatiquement comme ceci :
TEMP r0;
TEMP r1;
TEMP r2;
...
TEMP rn;

une dernière , pour supprimer la ligne qui contient tel chaîne , comment s'y prendre

merci d'avance
  • # autre chose

    Posté par  . Évalué à 1.

    aussi je voudrait ajouter une commande pour que les variables "s" de mes fichiers qui sont par exemple s0, s1, s2... soit remplacé par variable[0], variable[1], variable[2]...
    • [^] # Re: autre chose

      Posté par  . Évalué à 2.

      sed -e 's/\<s\([0-9]\+\)\>/variable[\1]/g'

      Pour expliquer :
      \< : début de mot
      s : un s
      [0-9]\+ : 1 nombre ([à-9] match chiffre, le \+ signifie un ou plus)
      \> fin de mot (pour ne pas prendre s23rt)

      Cordialement,

      Etienne
  • # sed

    Posté par  . Évalué à 3.

    il y a plein de problème dans ton script.
    je commence par l'un d'eux :

    sed 's/\<\,\|\,\ \>/\,\ /g' $file$tmp3 >$file$tmp4 #ici par contre ça ne fonctionne pas , je voudrais remplacer les virgules (",") et virgule+espace(", ") en virgule+espace (", ")

    ce n'est pas la peine de protéger les caractères < et ,
    Il suffit de faire ça :

    sed -e 's/,/, /g' $file$tmp3 | sed -e 's/,  /, /g' > $file$tmp4

    (on ajoute un espace après chaque virgule, et puis on en supprime un quand il y a 2 espaces qui se suivent)



    ensuite, le truc suivant n'est pas bon non plus :
    sed -i $file$tmp4 "s/.*/&'$end'/g" #fonctionne pas non plus , je veut ajouter "END" a la fin du fichier
    car sed travaille ligne par ligne.
    le plus simple : est de faire :
    echo END >> $file$tmp4
  • # sed -i et autres ...

    Posté par  . Évalué à 1.

    quelques remarques pour améliorer ton script :
    for file in [^$prefix]*
    do
    echo $file
    done

    fonctionne chez moi ... Bizzare que ça ne passe pas chez toi.

    - Tu peux éventuellement utiliser des trucs spécifiques à bash (moins portable donc ) :
    shopt -s extglob
    for file in !($prefix); do
    echo $file
    done

    man bash pour plus de détails

    - pour éviter tous les fichiers temporaires, tu peux utiliser l'option -i de sed

    - une regex plus simple pour matcher le motif virgule ou virgule + espace est :
    , \? (soit virgule + espace + point d'interrogation echappé). Ensuite, dans ton motif de substitution, tu n'as plus besoin d'échapper les caractère
    's/, \?/, /g' doit suffire. Les motifs \< et \> ne sont pas utiles ici, puisque l'espace et la virgule sont déjà des délimiteurs de mot.

    - pour rajouter END à la fin, le mieux, c'est encore :
    echo $end >> $file
    (simple is beautiful ;)
    • [^] # Re: sed -i et autres ...

      Posté par  . Évalué à 2.

      merci à vous deux

      à quoi sert le -e ?
      dans le man de sed ils mettent : "add the script to the commands to be executed" mais je comprend pas tres bien et sans cette argument cela fonctionne aussi.
      • [^] # Re: sed -i et autres ...

        Posté par  . Évalué à 2.

        l'option -e de sed, c'est pour faire la v2 de ton script ;-)

        En fait, plutôt que lancer plusieurs sed avec une regex chacun, tu peux lancer un seul sed avec plusieurs regex. L'option -e permet de faire ça, genre :
        sed -e regex1 -e regex2 ... -e regexn

        Possible que sur certaines plate forme, l'option -e soit obligatoire, même quand il y a une seule regex. Je ne sais plus trop, mais j'ai pris l'habitude de le mettre tout le temps maintenant ...
    • [^] # Re: sed -i et autres ...

      Posté par  . Évalué à 1.

      j'ai rajouter également :

      sed '/^$/d' $file$tmp1
      sed '/./!d' $file$tmp1

      pour supprimer les ligne vide mais ça me les supprime pas.
      en fait je voudrais plutôt supprimer uniquement le ligne vide qui se trouve à la fin des fichiers
      • [^] # Re: sed -i et autres ...

        Posté par  . Évalué à 2.

        j'ai trouvé ...
        pour ceux que ça intéresse :

        sed -e :a -e '/^\n*$\|^[ ]*$\|^[ t]*$/ {$d;N;ba' -e '}' $file$tmp1 > $file$tmp2


        supprime les ligne blanche en fin de fichier

        ..euh , je voudrait supprimer les commentaires , plus précisément tout les lignes contenu entre un "/*" et un "*/" , les lignes contenant ces début et fin de commentaire doivent être supprimer également

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.