Forum Programmation.shell problème avec commande sed

Posté par  .
Étiquettes :
0
5
mai
2009

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


connect to oracle (&conxora);

create table table1 as
select ID_PERS

from connection to oracle
(
select distinct pers.ID_PERS

FROM tab_grp grp , 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 = grp.id_pers
and (pers.date_supp_si is null or pers.date_supp_si > &date_quote)
order by id_pers
);
disconnect from oracle;
connect to oracle (&conxora);

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
);
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 :


table1;tab_grp;
table1;tab_pers;ID_PERS
table2;table_from1;ID_PRODUIT
table2;table_from1;CODE_PRODUIT
table2;table_from1;TOP_1
table2;table_from1;TOP_2


Sur mon pc sous ubuntu en bash ce script fonctionne :


var=$(cat programme1.out)
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
do
donnee=$(sed 's/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="\1" nom_colonne="\2" nom_table_from="\3"/I' <<< $ligne)
eval $donnee
echo "$table
$nom_colonne
$nom_table_from
"
done

resultat:

table1
ID_PERS
tab_grp grp , tab_pers pers

table2
ID_PERS, ID_PRODUIT, CODE_PRODUIT, TOP_1 TOP_2
table_from1

table2
ID_PERS, ID_PRODUIT, CODE_PRODUIT, TOP_1 TOP_2
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 :


var=$(cat programme1.out)
sed -n 's/connect to oracle (&conxora)\;//g;s/disconnect from oracle\;//g;s/\;/\n/g;p' <<< $var | while read ligne
do
donnee=$(sed 's/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="\1" nom_colonne="\2" nom_table_from="\3"/I' <<< $ligne)
eval $donnee
echo "$table $nom_colonne $nom_table_from"
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
  • # Rien à voir

    Posté par  . Évalué à 5.

    Je trouve très très moche ton var=$(cat fichier) puis sed -n 'blahblah' <<< $var.
    (je ne connaissais même pas le triple <)
    Sed sait lire dans un fichier, il te suffit juste de lui filer en argument :
    sed -n 'blahblah' fichier
    ...
    Quant à ton problème, je ne peux pas vraiment t'aider ...
    • [^] # Re: Rien à voir

      Posté par  . Évalué à 2.

      Et en fait je me suis trompé, si tu veux lui filer le fichier en argument, il faut mettre ton expression avec -e :
      sed -ne 'blahblah' fichier

Suivre le flux des commentaires

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