OT: grep nach Ausdruck über mehrere Zeilen

  • Hallo, vielleicht kann mir schnell einer einen Tip geben, muss einige PHP Dateien nach einen bestimmten Ausdruck durchsuchen..



    Erst mal Hintergrund
    Habe einen Webserver auf den laufen einige PHP Sachen und den möchte ich auf Mysql 5.0 updaten. Leider hat sich da im Syntax was geändert so dass Anfragen mit "Left join" Probleme machen.
    (Left join bindet stärker als ",")
    Folgende Anfrage macht z.b. Probleme:


    SELECT * FROM t1, t2 LEFT JOIN t3 on t1.ID=t2.ID


    Muss diese Anfragen jetzt finden und umschreiben auf


    SELECT * FROM (t1, t2) LEFT JOIN t3 on t1.ID=t2.ID


    Um genau das Finden der Anfragen geht es jetzt. Um eine manuelle Nachbearbeitung komme ich dann eh nicht rum.
    Ich suche also alle Dateien zwischen denen zwischen FROM und LEFT JOIN ein "," drin ist.


    grep -R -i -E "FROM.+,.+LEFT\ JOIN" *


    liefert mir auch schon fast das richtige Ergebnis, sofern die SQL-Anfragein einer Zeile steht. Wie kann ich den Ausdruck erweitern dass es über mehrere Zeilen funktioniert:


    SELECT * FROM t1, t2
    LEFT JOIN t3 on t1.ID=t2.ID


    alternativ würde mir jetzt noch einfallen, mit sed alle Zeilenumbrüche durch Leerstellen ersetzen und dann in grep füttern.


    Gruß
    Roland

    Software: VDR 1.4.3, mp3, osdpip, streamdev-server, femon, wapd, X11, Wireless Keyboard Kernel: 2.6.18
    Hardware: 1x DVB-S v 1.3, 1x Skystar 2, Celeron@2GHz, 256 MB RAM, 4 HDs Raid1/5, Total: 600 GB, Asus P4S533 cmi8738 & LAN on board 6 PCI
    40" Sammelbestellungs-LCD an ATI Radeon 9550 DVI-Out + tvtime, 70 cm TV an J2-RGB-Out
    Organisator der ersten und zweiten VDR-Sanitizer Sammelbestellung.
    In progress: POV-ION 330 - MediaPointer MP-S2 - vdr 1.7.9 - vdr-xine(vdpau)

  • Hi,


    ich habe das auch mal gemacht. Mit perl kannst du über mehrere Zeilen suchen. Google mal nach perl, regular expression und m/.


    Gruss Sven

    VDR1 : PIII - 550 Mhz - 256MB - 160 GB + 250 GB - DVD Brenner - 2 * DVB-S Budget - DXR3 - Etch + e-tobi
    VDR2 : PII - 233 Mhz - 256MB - diskless - DXR3 - c't VDR5 + e-tobi
    VDR3 : S100 - zendeb

    Einmal editiert, zuletzt von svkn ()

  • Das Problem ist, dass man bei mehrzeiligen Sachen schnell mehr findet, als einem lieb ist:


    SELECT * FROM t1,t2
    ... (hundert weitere Codezeilen)
    SELECT * FROM t3 LEFT JOIN t4


    ... der fett markierte Bereich trifft auf dein Suchkriterium auch zu.


    Gruß,


    Udo

  • Hmm, da hast recht. Da ich aber die Files dann eh per Hand editieren muss, seh ich das dann ja. Ich schätze mal über den Daumen dass von den ca. 30.000 PHP-Files die sich da inzwischen angesammelt haben vielleicht 100 Files von dem Problem betroffen sind.
    Werd dann wohl mal ein Perlskript o.ä. basteln dass mir die potentiellen Fehlerquellen ausgibt, auch wenn ein paar "false positives" dabei sind.


    Gruß
    Roland

    Software: VDR 1.4.3, mp3, osdpip, streamdev-server, femon, wapd, X11, Wireless Keyboard Kernel: 2.6.18
    Hardware: 1x DVB-S v 1.3, 1x Skystar 2, Celeron@2GHz, 256 MB RAM, 4 HDs Raid1/5, Total: 600 GB, Asus P4S533 cmi8738 & LAN on board 6 PCI
    40" Sammelbestellungs-LCD an ATI Radeon 9550 DVI-Out + tvtime, 70 cm TV an J2-RGB-Out
    Organisator der ersten und zweiten VDR-Sanitizer Sammelbestellung.
    In progress: POV-ION 330 - MediaPointer MP-S2 - vdr 1.7.9 - vdr-xine(vdpau)

  • Eine Idee hätte ich noch, vorausgesetzt "FROM" und "," stehen in einer Zeile:


    Code
    grep -R -i -E "FROM.+,.+" -A 5 * | grep "LEFT JOIN"


    man grep -> pro Treffer auch die folgenden 5 Zeilen ausgeben lassen und diese dann nochmal durchsuchen.

  • Supi, das bringt mich auf eine neue Idee.
    Ich such mir zuerst alle Files mit LEFT JOIN und durchsuch dann die Zeilen davor ohne Zeilenumbruch:


    Code
    JOINS=`grep -i "LEFT JOIN" -B 10 -A 3 $1`
    STR=`echo "$JOINS" | tr '\n' ' ' | grep -i -E "FROM.+,.+LEFT\ JOIN"`
    if [ "$STR" ]; then
        echo "---- $1 ----";
        echo "$JOINS"
        echo "------------";
    fi;


    So das Skript läuft jetzt erst mal... muss mal auf das Ergebnis warten.


    Gruß
    Roland

    Software: VDR 1.4.3, mp3, osdpip, streamdev-server, femon, wapd, X11, Wireless Keyboard Kernel: 2.6.18
    Hardware: 1x DVB-S v 1.3, 1x Skystar 2, Celeron@2GHz, 256 MB RAM, 4 HDs Raid1/5, Total: 600 GB, Asus P4S533 cmi8738 & LAN on board 6 PCI
    40" Sammelbestellungs-LCD an ATI Radeon 9550 DVI-Out + tvtime, 70 cm TV an J2-RGB-Out
    Organisator der ersten und zweiten VDR-Sanitizer Sammelbestellung.
    In progress: POV-ION 330 - MediaPointer MP-S2 - vdr 1.7.9 - vdr-xine(vdpau)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!