Det bästa sättet att göra detta enligt mig är att använda Regular Expressions eller SED/AWK för att formatera allt, det ger oss bonusen med ersättningskartor i farten. Chansen att du kan ha kodfel är dock stor, så det är lite svårt.
låt mig jobba på det lite så kan jag se om jag kan komma på en bra lösning. Är det garanterat att du kapslar in alla SQL-citattecken?
REDIGERA
Prova detta
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 ;'
Här är ett exempel
$ 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";
Är det snyggt? nej, inte alls, funkar det... Japp.
Jag ska försöka skapa en filterfil och kanske ett litet bash-program eller något när jag får tid att köra den här heta röran.
REDIGERA
Här är lite reviderad kod som ser snyggare ut (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";