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 eric . Évalué à 1.
[^] # Re: autre chose
Posté par Étienne . Évalué à 2.
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 goeb . Évalué à 3.
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 gaaaaaAab . Évalué à 1.
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 eric . Évalué à 2.
à 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 gaaaaaAab . Évalué à 2.
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 eric . Évalué à 1.
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 eric . Évalué à 2.
pour ceux que ça intéresse :
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
[^] # Re: sed -i et autres ...
Posté par eric . Évalué à 1.
sed -e :a -e '/^\n*$\|^[ ]*$\|^[ t]*$/ {$d;N;ba' -e '}' $file$tmp1 > $file$tmp2 ne fonctione pas
quelqu'un aurait une idée????
[^] # Re: sed -i et autres ...
Posté par NeoX . Évalué à 3.
http://linuxfr.org/forums/26/23070.html
finalement à moins que le fichier ne fasse plus de 2500lignes,
tu aurais presque gagner du temps à le reecrire...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.