De beste manier om dit naar mijn mening te doen is om reguliere expressies of SED/AWK te gebruiken om alles te formatteren, het geeft ons de bonus van vervangende kaarten ter plekke. De kans dat je codefouten hebt is echter groot, dus het is best lastig.
laat me er een beetje aan werken en ik kan kijken of ik een goede oplossing kan bedenken. Is het gegarandeerd dat u alle dubbele aanhalingstekens van SQL inkapselt?
BEWERKEN
Probeer dit
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 ;'
Hier is een voorbeeld
$ 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";
Is het mooi? nee, helemaal niet, werkt het.... Ja.
Ik zal proberen een filterbestand te maken en misschien een klein bash-programma of zoiets als ik tijd heb om deze hete puinhoop uit te voeren.
BEWERKEN
Hier is wat herziene code, ziet er mooier uit (soort)
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";