URL: https://linuxfr.org/forums/programmation-shell/posts/probl%C3%A8me-avec-commande-sed Title: problème avec commande sed Authors: stagebi Date: 2009年05月05日T15:38:06+02:00 Tags: ubuntu Score: 0 Bonjour! J'ai un texte fichier programme1.out qui ressemble à ca : connect to oracle (&conxora); create table table1 as £spaces£ £/spaces£select ID_PERS £spaces£ £/spaces£from connection to oracle £spaces£ £/spaces£( £spaces£ £/spaces£select distinct pers.ID_PERS £spaces£ £/spaces£FROM tab_grp grp , tab_pers pers £spaces£ £/spaces£where date_deb_grp <= &date_quote £spaces£ £/spaces£and (date_fin_grp is null or date_fin_grp> &date_quote) £spaces£ £/spaces£and pers.id_pers = grp.id_pers £spaces£ £/spaces£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 £spaces£ £/spaces£select ID_PERS, £spaces£ £/spaces£ID_PRODUIT, £spaces£ £/spaces£CODE_PRODUIT, £spaces£ £/spaces£TOP_1 £spaces£ £/spaces£TOP_2 £spaces£ £/spaces£ £spaces£ £/spaces£from connection to oracle £spaces£ £/spaces£( £spaces£ £/spaces£select ID_PERS, £spaces£ £/spaces£ID_PRODUIT, £spaces£ £/spaces£CODE_PRODUIT, £spaces£ £/spaces£max (case when (CODE ='01' ) then 1 else 0 end) as TOP_1 £spaces£ £/spaces£max (case when (CODE='02' ) then 1 else 0 end) as TOP_2 £spaces£ £/spaces£from table_from1 £spaces£ £/spaces£where CODE in ('01','02') £spaces£ £/spaces£and ID_MOIS <= &id_mois £spaces£ £/spaces£group by ID_PERS,ID_PRODUIT £spaces£ £/spaces£); 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 £spaces£ £/spaces£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 " £spaces£ £/spaces£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 £spaces£ £/spaces£donnee=$(sed 's/^create table \(.*\) as select \(.*\) from connection .*from \(.*\) where ..*$/table="1円" nom_colonne="2円" nom_table_from="3円"/I' <<< $ligne) £spaces£ £/spaces£eval $donnee £spaces£ £/spaces£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