[ksh ou bash] Erreur avec sed

Erreur avec sed [ksh ou bash] - Shell/Batch - Programmation

Marsh Posté le 05-05-2009 à 10:50:31    

Bonjour!
J'ai un texte fichier programme1.out qui ressemble à ca :  
 

Code :
  1. connect to oracle (&conxora);
  2. create table table1 as
  3.     select  ID_PERS
  4.         from connection to oracle
  5.         (
  6.         select  distinct pers.ID_PERS
  7.         FROM tab_grp grp , tab_pers pers
  8.         where date_deb_grp <= &date_quote
  9.               and (date_fin_grp is null or date_fin_grp > &date_quote)
  10.               and pers.id_pers = grp.id_pers
  11.               and (pers.date_supp_si is null or pers.date_supp_si > &date_quote)
  12. order by id_pers
  13. );
  14. disconnect from oracle;
  15. connect to oracle (&conxora);
  16. create table table2 as
  17.   select    ID_PERS,
  18.             ID_PRODUIT,
  19.             CODE_PRODUIT,
  20.             TOP_1
  21.             TOP_2
  22.                
  23.     from connection to oracle
  24.     (
  25.         select ID_PERS,
  26.                ID_PRODUIT,
  27.                 CODE_PRODUIT,
  28.                 max (case when (CODE ='01' ) then 1 else 0 end) as TOP_1
  29.                 max (case when (CODE='02' ) then 1 else 0 end) as TOP_2
  30.         from table_from1
  31.         where  CODE in ('01','02')
  32.         and    ID_MOIS <= &id_mois
  33.         group by ID_PERS,ID_PRODUIT
  34.     );
  35. disconnect from oracle;


 
A partir de ce fichier, il faudrait que je récupère pour chaque requête (entre connect to oracle et disconnect from oracle) le nom de la table créée, le nom des tables utilisées (celle dans les FROM, le vrai nom, pas l'alias) ainsi que les différentes colonnes sélectionnées dans le select.
A l'arrivée je voudrai avoir un affichage dans ce genre : table_cree | nom_table_from | nom_colonne
 
Exemple :  
 

Code :
  1. table1;tab_grp;
  2. table1;tab_pers;ID_PERS
  3. table2;table_from1;ID_PRODUIT
  4. table2;table_from1;CODE_PRODUIT
  5. table2;table_from1;TOP_1
  6. table2;table_from1;TOP_2


 
Sur mon pc sous ubuntu en bash ce script fonctionne :  
 

Code :
  1. var=$(cat programme1.out)
  2. sed -n '/connect to oracle/,/disconnect from oracle/{s/connect to oracle (&conxora)\;//g;s/disconnect from oracle\;//g;s/\;/\n/g;p}' <<< $var | while read ligne  
  3. do
  4. donnee=$(sed 's/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="\1" nom_colonne="\2" nom_table_from="\3"/I' <<< $ligne)
  5. eval $donnee
  6. echo "$table
  7. $nom_colonne
  8. $nom_table_from
  9. "
  10. done


resultat:

Code :
  1. table1
  2. ID_PERS
  3. tab_grp grp , tab_pers pers
  4. table2
  5. ID_PERS, ID_PRODUIT, CODE_PRODUIT, TOP_1 TOP_2
  6. table_from1
  7. table2
  8. ID_PERS, ID_PRODUIT, CODE_PRODUIT, TOP_1 TOP_2
  9. table_from1


 
Cela n'est pas encore exactement ce que j'attend mais c'est déja un bon début.
Quand j'essaye ce script sur un environnement IBM UNIX AIX en bash j'obtient cette erreur  :
 
sed: Function /connect to oracle/,/disconnect from oracle/{s/connect to oracle (&conxora)\;//g;s/disconnect from oracle\;//g;s/\;/
\n/g;p} cannot be parsed
 
Et en ksh :  
 
ksh: syntax error: `<' unexpected (bon ça c'est normal le script est fait en bash)
 
 
En modifiant le premier sed j'ai une erreur sur le deuxième :  
 

Code :
  1. var=$(cat programme1.out)
  2. sed -n 's/connect to oracle (&conxora)\;//g;s/disconnect from oracle\;//g;s/\;/\n/g;p' <<< $var | while read ligne  
  3. do
  4. donnee=$(sed 's/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="\1" nom_colonne="\2" nom_table_from="\3"/I' <<< $ligne)
  5. eval $donnee
  6. echo "$table $nom_colonne $nom_table_from"
  7. done


 
sed: Function s/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="\1" nom_colonne="\2" nom_tab
le_from="\3"/I cannot be parsed
 
Vous avez une idée d'où peuvent venir ces erreurs? version de sed?
 
Merci


Message édité par stagebi le 05-05-2009 à 11:21:29
Reply

Marsh Posté le 05-05-2009 à 10:50:31   

Reply

Marsh Posté le 05-05-2009 à 11:04:26    

Les utilitaires unix (sed, awk, grep et consors) ne sont pas standardisés, et diffèrent donc entre les OS. Les outils GNU ne sont pas les mêmes que ceux d'AIX, de Solaris, d'HP-UX ou autres.
 
Il te faut donc potasser la manpage de sed.

Reply

Marsh Posté le 05-05-2009 à 14:48:54    

Merci pour la réponse, je viens de mieux regarder le man et de la doc en ligne.
Apparemment il faudrait déja utiliser des " au lieu des ' pour sed, et l'option I pour ne pas tenir compte de la casse n'existe pas, j'ai donc fait l'essai avec ça :  

Code :
  1. var=$(cat programme1.out)
  2. sed -n "s/connect to oracle (&conxora)\;//g;s/disconnect from oracle\;//g;s/\;/\n/g;p" <<< $var | while read ligne
  3. do
  4.     donnee=$(sed "s/^c[C]r[R]e[E]a[A]t[T]e[E] t[T]a[A]b[B]l[L]e[E] \(.*\) a[A]s[S] s[S]e[E]l[L]e[E]c[C]t[T] \(.*\) f[F]r[R]o[O]m[M] c[C]o[O]n[N]n[N]e[E]c[C]t[T]i[I]o[O]n[N] .*f[F]r[R]o[O]m[M] \(.*\) w[W]h[H]e[E]r[R]e[E] ..*$/table=\1 nom_colonne=\2 nom_table_from=\3/" <<< $ligne)
  5.    eval $donnee
  6.    echo "$table $nom_colonne $nom_table_from"
  7. done


 
j'obtiens maintenant cette erreur :  
 
bash: eval: line 6: syntax error near unexpected token `('
bash: eval: line 6: `create table table1 as select ID_PERS from connection to oracle ( select distinct pers.ID_PERS FROM tab_grp g
rp , tab_pers pers where date_deb_grp <= &date_quote and (date_fin_grp is null or date_fin_grp > &date_quote) and pers.id_pers = g
rp.id_pers and (pers.date_supp_si is null or pers.date_supp_si > &date_quote) order by id_pers )n create table table2 as select ID
_PERS, ID_PRODUIT, CODE_PRODUIT, TOP_1 TOP_2 from connection to oracle ( select ID_PERS, ID_PRODUIT, CODE_PRODUIT, max (case when
(CODE ='01' ) then 1 else 0 end) as TOP_1 max (case when (CODE='02' ) then 1 else 0 end) as TOP_2 from table_from1 where CODE in (
'01','02') and ID_MOIS <= &id_mois group by ID_PERS,ID_PRODUIT )n'


Message édité par stagebi le 05-05-2009 à 14:50:06
Reply

Marsh Posté le 05-05-2009 à 15:02:14    

urgh
 
Utilise tr pour convertir en upper case avant ton sed, ça t'évitera ta bidouille, rendra la chose plus lisible et te permettra de cerner le problème plus facilement.

Reply

Marsh Posté le 05-05-2009 à 15:21:00    

Oui c'est vrai que ça devenait illisible...
Le fichier programme1.out contient donc maintenant  

Code :
  1. CONNECT TO ORACLE (&CONXORA);
  2. CREATE TABLE TABLE1 AS
  3.     SELECT  ID_PERS
  4.         FROM CONNECTION TO ORACLE
  5.         (
  6.         SELECT  DISTINCT PERS.ID_PERS
  7.         FROM TAB_GRP GRP , TAB_PERS PERS
  8.         WHERE DATE_DEB_GRP <= &DATE_QUOTE
  9.               AND (DATE_FIN_GRP IS NULL OR DATE_FIN_GRP > &DATE_QUOTE)
  10.               AND PERS.ID_PERS = GRP.ID_PERS
  11.               AND (PERS.DATE_SUPP_SI IS NULL OR PERS.DATE_SUPP_SI > &DATE_QUOTE)
  12. ORDER BY ID_PERS
  13. );
  14. DISCONNECT FROM ORACLE;
  15. CONNECT TO ORACLE (&CONXORA);
  16. CREATE TABLE TABLE2 AS
  17.   SELECT    ID_PERS,
  18.             ID_PRODUIT,
  19.             CODE_PRODUIT,
  20.             TOP_1
  21.             TOP_2
  22.                
  23.     FROM CONNECTION TO ORACLE
  24.     (
  25.         SELECT ID_PERS,
  26.                ID_PRODUIT,
  27.                 CODE_PRODUIT,
  28.                 MAX (CASE WHEN (CODE ='01' ) THEN 1 ELSE 0 END) AS TOP_1
  29.                 MAX (CASE WHEN (CODE='02' ) THEN 1 ELSE 0 END) AS TOP_2
  30.         FROM TABLE_FROM1
  31.         WHERE  CODE IN ('01','02')
  32.         AND    ID_MOIS <= &ID_MOIS
  33.         GROUP BY ID_PERS,ID_PRODUIT
  34.     );
  35. DISCONNECT FROM ORACLE;


 
et avec ce script :  

Code :
  1. var=$(cat programme1.out)
  2. sed -n "s/CONNECT TO ORACLE (&CONXORA)\;//g;s/DISCONNECT FROM ORACLE\;//g;s/\;/\n/g;p" <<< $var | while read ligne  
  3. do
  4. donnee=$(sed "s/^CREATE TABLE \(.*\) AS SELECT \(.*\) FROM CONNECTION .*FROM \(.*\) WHERE ..*$/table=\1 nom_colonne=\2 nom_table_from=\3/" <<< $ligne)
  5. eval $donnee
  6. echo "$table $nom_colonne $nom_table_from"
  7. done


 J'ai l'erreur :  
 
bash: eval: line 6: syntax error near unexpected token `('
')nOUP BY ID_PERS,ID_PRODUIT THEN 1 ELSE 0 END) AS TOP_21ATE_QUOTE)


Message édité par stagebi le 05-05-2009 à 15:22:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed