Forum Programmation.shell Extraire une sous chaîne de plusieurs lignes

Posté par  .
Étiquettes : aucune
0
3
mar.
2005
Je souhaite extraire les requêtes SQL contenues dans un source Powerbuilder (qui est un binaire)

Donc j'ai fait un strings src.pbl > test.txt

mais ça me retourne 9000 lignes de texte ... et parmi elle des requêtes SQL.

Donc je souhaite filtrer tout ce texte pour ne récupérer que les sous chaînes comprises entre "SELECT" et "USING TRLOCALE;" mais qui sont sur plusieurs lignes et c'est là que j'ai un soucis :/ je n'arrive pas à récupérer un pattern qui correspond à plusieurs lignes ... (sed ou grep)

Dam

ex de requete :


SELECT SUM("INSEE"."Q_MEN2_INSEE"), SUM("INSEE"."M_POP2_INSEE")
INTO :LNBMENAGESINSEE, :LPOPULATIONINSEE
FROM "INSEE", "ZON_INSEE", "ZONE"
WHERE ( "INSEE"."C_COMM_INS" = "ZON_INSEE"."C_COMM_INS" ) AND
( "ZON_INSEE"."C_ZONE" = "ZONE"."C_ZONE" ) AND
( "ZON_INSEE"."C_VER" = "ZONE"."C_VER" ) AND
( ( "ZONE"."C_VER" = :LCODEVERSION ) AND
( "ZONE"."C_ZONE" = :STRZONE ) )
USING TRLOCALE;

  • # Comme ca ca devrait marcher

    Posté par  (site web personnel) . Évalué à 3.

    grep -e [SELECT][[:alnum:]][TRLOCALE] nomdufichierouonfouille
    • [^] # Re: Comme ca ca devrait marcher

      Posté par  (site web personnel) . Évalué à 3.

      On me dit que comme ca c'est plus court :

      grep -e [SELECT].*[TRLOCALE] nomdufichierouonfouille
      • [^] # Re: Comme ca ca devrait marcher

        Posté par  . Évalué à 3.

        nope ca n'a pas l'air d'etre ca :/ il me sort des un tas de chose qui n'on pas grand chose a voir (les requetes sont dedans aussi ... mais par exemple voici le tail du resultat :


        "DEPT_DOSS"."C_VER" =0 ) AND ( "DEPT_DOSS"."C_DEPT" =0 )
        BLICtransaction.RDRD
        SELECT "DEPT_DOSS"."M_SURF_DOSS" , "DEPT_DOSS"."M_CA_DOSS" , "VERSION"."M_SURDAT*
        F_VER" , "VERSION"."M_CA_VER" , "VERSION"."M_PAN_VER" , "DEPT_DOSS"."M_PART_DEPT" FROM "DEPT_DOSS" , "VERSION" WHERE ( "DEPT_DOSS"."C_VER" ="VERSION".
        "C_VER" ) and ( ( "DEPT_DOSS"."C_VER" =0 ) AND ( "DEPT_DOSS"."C_DEPT" =0 ) )
        BLLCtransaction.RLRDRLRDRDRD
        SELECT "REND_ENS"."M_SURFMOY_REND" , "REND_ENS"."M_CA_DEPT" , "REND_ENSDAT*
        "."M_REND_REND" FROM "REND_ENS" , "TR_SURF" WHERE ( "REND_ENS"."C_TR_SURF" ="TR_SURF"."C_TR_SURF" ) and ( ( "REND_ENS"."C_ENS" =' ' ) AND ( "REND_ENS"
        ."N_PER" =' ' ) AND ( "REND_ENS"."C_DEPT" =0 ) AND ( "TR_SURF"."M_DEB_SURF" <= 0 ) AND ( "TR_SURF"."M_FIN_SURF" >= 0 ) )
        BSSLLCtransaction.RLRDRD
        SELECT "CONC"."C_CONC" FROM "CONC" WHERE "CONC"."C_CONC" =' ' AND "CONC"."C_VER"DAT*
        BSLCtransaction.





        Dam
  • # Hum...

    Posté par  . Évalué à 4.

    Et en oubliant le strings ?
    Genre :
    grep -z -U "SELECT.*;" src.pbl
    Le -z c'est pour dire que les chaînes de caractères finissent par \0, et non par CRLR, et -U pour dire que c'est un fichier binaire.
    Pas testé, car je n'ai pas de fichiers de ce type, mais bon.
    Si ça marche, ça ne devrait sortir que les chaînes de caractères ressemblant à SELECT.*;
    A tester, donc, et désolé si c'est pas la solution.
    • [^] # Re: Hum...

      Posté par  . Évalué à 2.

      Pas mal, ca fait un peu de bruit autour mais on se rapproche du l'idéal

      grep -z -a -U "SELECT .*;" src.pbl | sed "/^$/d"


      Dam

      ex fin du resultat obtenu :

      DAT* ö☺
      Boolean bRetour
      Pointer ptPointerCourant
      Long lIndex
      String strTypeZone
      //**********************
      //* CORPS DE LA FONCTION
      //--- Met en place le sablier
      ptPointerCourant = SetPointer(HourGlass!)
      //--- Déclare un curseur
      DECLARE Cur_Zone CURSOR FOR
      SELECT DISTINCT "ZONE"."C_ZONE",
      "ZONE"."T_ZONE"
      FROM "ZONE"
      WHERE "ZONE"."C_VER" = :lCODEVERSION
      ORDER BY "ZONE"."T_ZONE" ASC,
      "ZONE"."C_ZONE" ASC
      USING TRLOCALE;
      //--- Ouvre le curseur
      OPEDAT*
  • # Et avec Python

    Posté par  . Évalué à 1.

    un truc de ce style là :

    import re

    reg_req = re.compile("(SELECT.*?USING TRLOCALE;)",re.S )
    s = file("src.pbl","rb").read()

    for x in reg_req.findall(s):
        print "="*70,"\n"
        print x
  • # Sed le fait !

    Posté par  (site web personnel) . Évalué à 1.

    strings src.pbl | sed -n -e '/\<SELECT\>/,/\<USING *TRLOCALE/p'

Suivre le flux des commentaires

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