मेरी राय में ऐसा करने का सबसे अच्छा तरीका सब कुछ प्रारूपित करने के लिए नियमित अभिव्यक्ति या एसईडी/एडब्ल्यूके का उपयोग करना है, यह हमें फ्लाई पर प्रतिस्थापन मानचित्रों का बोनस देता है। हालांकि, कोड त्रुटियों की संभावना बहुत अधिक है, इसलिए यह काफी कठिन है।
मुझे इस पर थोड़ा काम करने दें और मैं देख सकता हूं कि क्या मैं एक अच्छा समाधान लेकर आ सकता हूं। क्या यह गारंटी है कि आप सभी SQL दोहरे उद्धरण चिह्नों को इनकैप्सुलेट कर रहे हैं?
संपादित करें
इसे आजमाएं
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 ;'
यहां एक उदाहरण दिया गया है
$ 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";
क्या यह सुंदर है? नहीं, बिल्कुल नहीं, क्या यह काम करता है.... हाँ।
मैं इस हॉट मेस को चलाने के लिए समय मिलने पर एक फ़िल्टर फ़ाइल और शायद थोड़ा बैश प्रोग्राम या कुछ और बनाने की कोशिश करूँगा।
संपादित करें
यहां कुछ संशोधित कोड दिया गया है, जो सुंदर दिखता है (सॉर्टा)
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";