|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
Bonjour,
Je dois modifier plusieurs programmes sous UNIX (ajouter des lignes après certaines commandes). comment puis-je faire pour automatiser ces modifications ? |
|
|
00
|
|
|
#2 |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 5 499 ![]() |
Bonjour,
Il nous faut plus d'informations si tu veux que l'on puisse t'aider !
Sinon, saches que Code :
sed 's/chaine_a_remplacer/nouvelle_chaine/g' fichier_origine > nouveau_fichier Donc en mettant quelques commandes de ce type dans un script, cela devrait te permettre de résoudre ton problème. |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
En fait on m'a parlé de l'outil awk pour faciliter les modif.
L'idée générale : j'ai X fichiers (tous sous le même répertoire), qui contiennent des lignes de commandes (en pro*c) et je dois rajouter à la suite de ces lignes une ligne de commande supllémentaire (toujours la même). Je sais pas si c'est clair, cà à l'air simple comme ça mais ??????? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
C'est pas encore très précis.
Qu'est ce que tu entends pas "à la suite" ? A la fin de chacune des lignes de commande recherchées ? Après le groupe de lignes recherché ? A la fin des fichier contenant ces commandes ? |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
permet d'ajouter une ligne à la fin d'un fichier.
Code :
C'est ça que tu veux ? |
||
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
OK,
Je vais te décrire un exemple de ce que je veux réaliser. j'ai plusieurs fichier .pc (a.pc, b.pc...) dans ces fichier j'ai une ligne qui se trouve dans le corps des fichiers je veux ajouter après cette ligne un autre exemple J'ai une ligne et je veux ajouter après cette ligne et ainsi de suite Le fait est que j'ai énormément de fichiers à traiter, et que j'ai beaucoup de ligne à ajouter. Je pourrais le faire manuellement, mais c'est au risque d'oublier certaines lignes voire certains fichiers. C'est pourquoi je voudrais créer des scripts qui me permettent de faire ces ajouts sans erreur. j'espère que tu pourras m'éclairer... |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Essaye ça:
Code :
|
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
Code :
sed -i 's/#include <gestimpr.h>/&\n#include<userprog.h>/' *.pc Code :
sed -i 's/EXEC SQL INCLUDE sqlca.h;/&\nEXEC SQL INCLUDE bmtmain.h;' *.pc |
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Attention, "sed -i" n'est pas à ma connaissance portable (spécifique Gnu sed).
Il est cependant simple de passer par des fichiers temporaires comme je l'ai fait avec awk. D'autre part, il est possible de faire toutes les modifs avec une seule commande sed: Code :
|
||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 946 ![]() |
J'ai cru comprendre qu'il souhaitait deux commandes distinctes (vu que l'une parle de C et l'autre de SQL).
Et en effet, encore que de nombreux autres sed possèdent cette option (par exemple, le sed de BSD), l'option -i n'est pas portable. Mais si l'on veut être portable, il faut aussi se passer du \n, qui n'est pas reconnu partout. Code :
Mais je trouve que le sed défini par posix est bien trop limité pour l'usage quotidien, et j'ai pris l'habitude d'utiliser les extensions de GNU. Je recommande d'ailleurs aux gens d'utiliser le GNU sed (ou autre sed de qualité) quand ils ont le choix. En utilisant des sed de mauvaise qualité, on passe à côté de beaucoup de choses utiles (option -i, caractères spéciaux et de nombreuses autres extensions). |
||
|
|
00
|
|
|
#11 | ||||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Citation:
Citation:
Citation:
Citation:
|
||||
|
|
00
|
|
|
#12 | ||
|
Membre expérimenté
![]() Inscription : mars 2007 Messages : 469 ![]() |
Petite rectification dans le awk :
Mettre next au lieu de continue + test pour éviter d'insérer plusieurs fois la même ligne Code :
__________________
Loi de Murphy: La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi. La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi. Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi. |
||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
[QUOTE=BlaireauOne;2528120]Petite rectification dans le awk :
Mettre next au lieu de continue + test pour éviter d'insérer plusieurs fois la même ligne Heu ... tu ajoutes une complexité inutile. Les deux patterns ne risquent pas d'apparaitre sur la meme ligne donc next est ici inutile. Il faut laisser continue qui sert justement à éviter d'insérer plusieurs fois la meme ligne. |
|
|
00
|
|
|
#14 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
Merci à tous pour vos indications. Le moins qu'on puisse dire, c'est que mon cas fait débat...
Je vais essayer de m'y retrouver dans tous cela. |
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
Est-ce qu'il ne faut pas intégrer BEGIN et END dans le script
if [ ! -f pc-org.tar ] then tar cf pc-org.tar *.pc || exit fi for file in *.pc do cp $file $file.org awk ' BEGIN /#include <gestimpr.h>/ { print $0 print "#include <userprog.h>" continue } /EXEC SQL INCLUDE sqlca.h;/ { print $0 print "EXEC SQL INCLUDE bmtmain.h;" continue } { print $0 } END ' < $file.org > $file done |
|
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Il ne sert à rien d'inclure un BEGIN et un END s'il n'y a aucune instruction a exécuter en debut ou in fin de traitement.
Pour répondre à ta question envoyée en message privé, le premier bloc d'instructions sert juste à faire un backup des fichiers originaux: Code :
|
||
|
|
00
|
|
|
#17 | |
|
Membre expérimenté
![]() Inscription : mars 2007 Messages : 469 ![]() |
[QUOTE=jlliagre;2528621]
Citation:
- "continue" fait passer à l'itération suivante dans une boucle (je ne vois pas de boucle while ou autre dans le awk qui nous occupeJe t'accorde que le test de présence d'enregistrements en doublon ajoute une complexité inutile (c'était pour montrer les possibilités de awk) http://www.shellunix.com/awk.html#break break, continue Break: sortie de boucle Continue: commence une nouvelle itération de la boucle. .../... next, exit Next: passe à l'enregistrement suivant. On reprend le script awk à son début Exit: ignore le reste de l'entrée et execute les actions définie par END
__________________
Loi de Murphy: La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi. La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi. Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi. |
|
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Tu as raison. J'ai utilisé une construction archaique qui ne fonctionne qu'avec les awk originaux (awk et nawk sous Solaris par exemple, ou gawk --traditional) . Les continue doivent etre remplacés par des next dans mon script pour plus de portabilité via une conformité POSIX.
|
|
|
00
|
|
|
#19 | ||
|
Membre du Club
![]() Inscription : mai 2007 Messages : 224 ![]() |
Coucou les gars,
J'ai bien pris note de toutes vos remarques et j'ai essayé de tester si le awk fonctionné sur un fichier. J'ai donc un fichier test.pc et j'ai créé un .sh dans lequel j'ai mit le code suivant. Code :
Avez vous une piste. Merci |
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Quel Unix utilises-tu ?
Il est très simple de supprimer ces ^M. Qu'entend-tu par "boucle et ne produit rien" ? Utilise les tags "code" pour que ton code soit plus lisible. Il manque un next dans ton avant dernier bloc. Le < est inutile et le nom du fichier doit apparaitre après le ' final, sur la meme ligne, pas la ligne suivante. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com