मेरे पास SQL ​​प्रकार की फ़ाइल के टेक्स्ट पार्सिंग की एक निश्चित विशिष्ट आवश्यकता है, नीचे विवरण दिया गया है।

बड़ी क्वेरी:

select
col A,
col B,
.
.
from
(select * from db1.table1 where conditions) t1
left outer join
(select * from db2.table2 where conditions) t2
on table1.col1 = table2.col1
left outer join
(select * from db3.table3 where conditions) t3
on table2.col1 = table3.col3

और क्वेरी इस तरह चल सकती है। मैं नीचे दिए गए विशिष्ट प्रारूप में क्वेरी को पार्स और संशोधित करने का प्रयास कर रहा था:

select
    col A,
    col B,
    .
    .
    from
    PH1 t1
    left outer join
    PH2 t2
    on table1.col1 = table2.col1
    left outer join
    PH3 t3
    on table2.col1 = table3.col3

प्लेस होल्डर्स (पीएच), मैं एक और अलग फाइल रखना चाहता हूं; मैं उन्हें यहां SQL में कॉल करूंगा (और यह समस्या नहीं है)।

मैं बैश में पार्स करने की कोशिश कर रहा हूं, और वास्तव में यह सुनिश्चित नहीं करता कि जगह धारकों द्वारा आंतरिक चयन प्रश्नों को कैसे बदला जाए। क्वेरी का पहला भाग (पहले FROM से ऊपर) को sed -n '/^SELECT/,/^FROM/p' द्वारा अलग किया जा सकता है।

मैं किसी भी तरह से दूसरी आधी आवश्यकता के लिए आगे बढ़ने के बारे में तर्क तैयार करने में सक्षम नहीं हूं।

कोई विचार?

2
knowone 13 फरवरी 2019, 02:12

1 उत्तर

सबसे बढ़िया उत्तर

Awk का उपयोग करना। क्या यह ऐसा कुछ है:

$ awk -v RS="" '{                # read until first empty line or end
    gsub(/\([^)]*\)/,"PH" ++n)   # replace (..) with PHn
    gsub(/\r?\n/,"&    ")        # newlines with newline and space
}1' file                         # output

आउटपुट:

select
    col A,
    col B,
    .
    .
    from
    PH1 t1
    left outer join
    PH1 t2
    on table1.col1 = table2.col1
    left outer join
    PH1 t3
    on table2.col1 = table3.col3
1
James Brown 13 फरवरी 2019, 02:21