Den bedste måde at gøre dette på efter min mening er at bruge Regular Expressions eller SED/AWK til at formatere alt, det giver os bonussen af erstatningskort i farten. Chancen for, at du kan have kodefejl, er dog stor, så det er lidt svært.
lad mig arbejde lidt på det, og jeg kan se, om jeg kan komme med en god løsning. Er det garanteret, at du indkapsler alle SQL-dobbelte anførselstegn?
REDIGER
Prøv dette
cd {{directory}} && find . -type f -print0 |
xargs -0 perl -i.bak -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;'
Her er et eksempel
$ printf '"select * from whatever where this = that and active = 1 order by something asc";\n' |
> perl -pe 's/select/SELECT/g ; s/from/\n\tFROM/g ; s/where/\n\t\tWHERE/g ; s/and/\n\t\tAND/g ; s/order by/\n\t\tORDER BY/g ; s/asc/ASC/g ; s/desc/DESC/g ;'
"SELECT *
FROM whatever
WHERE this = that
AND active = 1
ORDER BY something ASC";
Er det smukt? nej, slet ikke, virker det.... Yeup.
Jeg vil prøve at oprette en filterfil og måske et lille bash-program eller noget, efterhånden som jeg får tid til at køre dette varme rod.
REDIGER
Her er noget revideret kode, der ser smukkere ud (sorta)
printf '$request1 = "select * from whatever where this = that and active = 1 order by something asc";\n' |
perl -pe 's/select/SELECT/gi ; s/from/\n FROM/gi ; s/where/\n WHERE/gi ; s/and/\n AND/gi ; s/order by/\n ORDER BY/gi ; s/asc/ASC/gi ; s/desc/DESC/gi ;' |
awk 'NR == 1 {pad = length($0)/2; print} NR > 1 {gsub(/\r/,""); printf "%*s%s\n", pad, " ", $0}'
__OUTPUTS__
$request1 = "SELECT *
FROM whatever
WHERE this = that
AND active = 1
ORDER BY something ASC";