Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/10/2007, 14h49   #1
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
Par défaut recherche dans un programme .pc

C'est toujours moi avec un autre problème

J'ai un bloc de commande dans un programme
Code :
1
2
3
4
5
6

printf ("%s/Erreur ORACLE:\n %.70s (%d)\n",message.arr
, sqlca.sqlerrm.sqlerrmc, -sqlca.sqlcode);
printf ("Num Commande % 5.0lf % 2.0lf % 4.0lf\n ",
cdeent_n_aaaa_cpt, cdeent_n_mm_cpt, cdeent_n_cde);
Jusque là rien d'extraordinaire, si ce n'est que je dois remplacer ce bloc par
Code :
("Erreur ORACLE:\n %.70s (%d)\n", slaca.sqlerrm.sqlerrmc, -sqlca.sqlcode);
J'ai un gros problème de syntaxe puisqu'à l'exécution j'ai les messages d'erreurs suivants :
Code :
1
2
3
4
5
6
7
8
 awk : 0602-511 L'expression rÚguliÞre printf \(" ne peut pas contenir de nouvel
le ligne.La ligne source est 32.
Le contexte de l'erreur est
                /printf \("%s\/Erreur ORACLE:\n %.70s (%d)\n",message.arr >>>
 <<<                , sqlca.sqlerrm.sqlerrmc, -sqlca.sqlcode);
 Erreur de syntaxeLa ligne source est 33.
        awk : 0602-542 Il y a un caractÞre ) de trop.
 awk : 0602-500 QuitterLa ligne source est 33.
Quelqu'un pour un petit coup de main ???
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2007, 17h13   #2
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 969
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 969
Points : 1 376
Points : 1 376
Tu n'a pas posté le code awk qui provoque l'erreur.
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 08h07   #3
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
Voici comme demandé le code awk correspondant

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
for file in test.pc
do
  cp $file $file.org
  awk '
/#include <gestimpr.h>/ {
  print $0
  print "#include <userprog.h>  /* GF 01102007 */"
  next
}
/EXEC SQL INCLUDE sqlca.h;/ {
  print $0
  print "EXEC SQL INCLUDE bmtmain.h;  /* GF 01102007 */"
  next
}
/EXEC SQL BEGIN DECLARE SECTION;/{
  print $0
  print "/* GF 01102007 debut*/"
  print "VARCHAR sessionid [21],"
  print "        lib_err [2000],"
  print "        paragraphe_err [80];"
  print "int cd_ret;"
  print "/* GF 01102007 fin*/"
  next
}
/char[ \t]+TcSortie\[80\];\/\* nom du fichier de sortie \*\//{
  print $0
  print "char   lib_err1[2000];  /*GF 01102007*/"
  next
}
/fclose\(Fp\);/{
  print "        /*fclose(Fp);   GF 01102007 */"
  print "        pclose (Fp);   GF 01102007"
  next
}
/errexit:/{
  print "        EXEC SQL ROLLBACK WORK; /* RELEASE;   GF 01102007 */"
  continue
/return(0);/
  print "        /*return(0)*/"
  next
}
/system\(Lp\);/{
  print "        /*system(Lp);   GF 01102007 */"
  next
}
{
  print $0
} ' $file.org | tr -d '\r' > $file
done
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 08h16   #4
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
Ne tiens pas compte du post précédent, la partie du awk qui ne fonctionne pas c'est la suivante :

Code :
1
2
3
4
5
6
7
/EXEC SQL ROLLBACK WORK RELEASE;/{
  print "        EXEC SQL ROLLBACK WORK; /* RELEASE;   GF 01102007 */"
  continue
/return(0);/
  print "        /*return(0)*/"
  next
}
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 08h23   #5
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
Décidement j'ai du mal ce matin.

le bon awk est le suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
/printf \("%s\/Erreur ORACLE:\n %.70s (%d)\n",message.arr
               , sqlca.sqlerrm.sqlerrmc, -sqlca.sqlcode);
 printf ("Num Commande % 5.0lf % 2.0lf % 4.0lf\n ",
cdeent_n_aaaa_cpt, cdeent_n_mm_cpt, cdeent_n_cde);/{
  print "printf (""Erreur ORACLE:\n %.70s (%d)\n"", slaca.sqlerrm.sqlerrmc, -sqlca.sqlcode);"
  next
}
/system\(Lp\);/{
  print "        /*system(Lp);   GF 01102007 */"
  next
}
On va y arriver
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 11h45   #6
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
En fait j'ai fait quelques modif et ce que je souhaite réaliser est la chose suivante:

Dans un fichier .pc j'ai deux lignes de code que je veux remplacer par une seule. Je sais remplacer une ligne par une autre ou par rien, mais je ne sais pas RECHERCHER 2 lignes.

Moi je tape :

Code :
1
2
3
4
5
/EXEC SQL ROLLBACK WORK RELEASE;
 return(0);/{
  print "EXEC SQL ROLLBACK WORK; /*  RELEASE;   GF 01102007 */"
  next
}
et en erreur j'ai :
Code :
1
2
3
4
5
6
7
8
9
10
servora10:/index/u3/bernard/prog> chmod +x modiftestawk.sh
servora10:/index/u3/bernard/prog> modiftestawk.sh
 awk : 0602-511 L'expression rÚguliÞre EXEC SQL R ne peut pas contenir de nouvel
le ligne.La ligne source est 50.
Le contexte de l'erreur est
                /EXEC SQL ROLLBACK WORK RELEASE; >>>
 <<<    return(0);/{
 Erreur de syntaxeLa ligne source est 51.
 awk : 0602-500 QuitterLa ligne source est 51.
servora10:/index/u3/bernard/prog>
Je bloque en fait sur la recherche...
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2007, 21h48   #7
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Une façon de faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
awk '
{
 
	if ($0 ~ /EXEC SQL ROLLBACK WORK RELEASE;/) {
		sauv_enreg=$0
		getline
		if ($0 ~ /return\(0\);/) {
			print "EXEC SQL ROLLBACK WORK; /*  RELEASE;   GF 01102007 */"
			next
		} else {
			print sauv_enreg
		}
	}
	print $0
}
' proc.pc > tmp.pc
__________________
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.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2007, 08h45   #8
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
Ton code semble fonctionner, pour la résolution de mon problème. Seulement, le fait de rajouter ce bout de code a pour effet de me doubler toutes les lignes de mon programme test.pc.

Voici mon code complet (modiftestawk.sh)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
for file in test.pc
do
  cp $file $file.org
  awk '
/#include <gestimpr.h>/ {
  print $0
  print "#include <userprog.h>  /* GF 01102007 */"
  next
}
/EXEC SQL INCLUDE sqlca.h;/ {
  print $0
  print "EXEC SQL INCLUDE bmtmain.h;  /* GF 01102007 */"
  next
}
/EXEC SQL BEGIN DECLARE SECTION;/{
  print $0
  print "/* GF 01102007 debut*/"
  print "VARCHAR sessionid [21],"
  print "        lib_err [2000],"
  print "        paragraphe_err [80];"
  print "int cd_ret;"
  print "/* GF 01102007 fin*/"
  next
}
/char[ \t]+TcSortie\[80\];\/\* nom du fichier de sortie \*\//{
  print $0
  print "char   lib_err1[2000];  /*GF 01102007*/"
  next
}
/fclose\(Fp\);/{
  print "        /*fclose(Fp);   GF 01102007 */"
  print "        pclose (Fp);   GF 01102007"
  next
}
/printf \(\"%s\/Erreur ORACLE:\\n %.70s \(%d)\\n\",message.arr/{
  print " printf \(\"Erreur ORACLE:\\n %.70s (%d)\\n\", sqlca.sqlerrm.sqlerrmc,"
  next
}
/, sqlca.sqlerrm.sqlerrmc, -sqlca.sqlcode\);/{
  print "  -sqlca.sqlcode\);"
  next
}
/printf \(\"Num Commande % 5.0lf % 2.0lf % 4.0lf\\n \",/{
  next
}
/cdeent_n_aaaa_cpt, cdeent_n_mm_cpt, cdeent_n_cde\);/{
  next
}
{
if ($0 ~ /EXEC SQL ROLLBACK WORK RELEASE;/) {
  sauv_enreg=$0
  getline
  if ($0 ~ /return\(0\);/) {
   print "EXEC SQL ROLLBACK WORK; /*  RELEASE;   GF 01102007 */"
   next
  } else {
   print sauv_enreg
  }
 }
 print $0
}

/system\(Lp\);/{
  print "        /*system(Lp);   GF 01102007 */"
  next
}
{
  print $0
} ' $file.org | tr -d '\r' > $file
done
en rouge c'est la partie que j'ai rajoutée suite à ta remarque.
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2007, 08h54   #9
Membre du Club
 
Avatar de gege87270
 
Inscription : mai 2007
Messages : 224
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France, Haute Vienne (Limousin)

Informations forums :
Inscription : mai 2007
Messages : 224
Points : 45
Points : 45
J'ai trouvé le bug, ton code est bon hormis le dernier print $0

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
{
if ($0 ~ /EXEC SQL ROLLBACK WORK RELEASE;/) {
  sauv_enreg=$0
  getline
  if ($0 ~ /return\(0\);/) {
   print "EXEC SQL ROLLBACK WORK; /*  RELEASE;   GF 01102007 */"
   next
  } else {
   print sauv_enreg
  }
 }
 
}
Merci en core pour le coup de main
gege87270 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h45.


 
 
 
 
Partenaires

Hébergement Web