Cách tốt nhất để làm điều này theo ý kiến của tôi là sử dụng Biểu thức chính quy hoặc SED / AWK để định dạng mọi thứ, nó mang lại cho chúng tôi phần thưởng là các bản đồ thay thế nhanh chóng. Tuy nhiên, khả năng bạn có thể gặp lỗi mã là rất cao, vì vậy nó khá khó khăn.
hãy để tôi làm việc với nó một chút và tôi có thể xem liệu tôi có thể đưa ra một giải pháp hàng hóa hay không. Có đảm bảo rằng bạn đang đóng gói tất cả các dấu ngoặc kép trong SQL không?
CHỈNH SỬA
Hãy thử điều này
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 ;'
Đây là một ví dụ
$ 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";
Nó có đẹp không? không, không hề, nó có hoạt động không .... Yeup.
Tôi sẽ thử tạo một tệp bộ lọc và có thể là một chương trình bash nhỏ hoặc một cái gì đó khi tôi có thời gian để chạy mớ hỗn độn nóng bỏng này.
CHỈNH SỬA
Đây là một số mã đã sửa đổi, trông đẹp hơn (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";