नीचे मेरी इनपुट फ़ाइल की आंशिक सामग्री है:

   xyz 
   abc
   MainContent(abc_dt) {
      sc: it;
    }
    MainContent(xyz_cnt) {
      sc : it;
    }
    MainContent(asd_zxc) {
      sc : it;
    }

यहां, मैं "मेनकंटेंट" लाइन खोजना चाहता हूं और इससे पहले नई लाइन जोड़ना चाहता हूं ... इस नई लाइन में "एसबी (टेक्स्ट जो मेनकंटेंट_1 में ब्रैकेट के अंदर है)" होना चाहिए ... इसमें ओपनिंग ब्रैकेट और क्लोजिंग ब्रैकेट भी शामिल होना चाहिए। अगले एसबी घटना से पहले:

स्क्रिप्ट से अपेक्षित आउटपुट:

   xyz 
   abc
   Sb(abc_dt_sb1) {
   MainContent(abc_dt) {
      sc: it;
    }
   }
   Sb(xyz_cnt_sb2) {
    MainContent(xyz_cnt) {
      sc : it;
    }
   } 
   Sb(asd_zxc_sb3) {
      MainContent(asd_zxc) {
      sc : it;
    }
   }

क्या कोई इसके लिए टीसीएल स्क्रिप्ट बनाने में मेरी मदद कर सकता है?

0
Programmer_99999 26 मार्च 2020, 14:38

1 उत्तर

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

यह कोड आपके टेक्स्ट को मानक इनपुट पर संसाधित करने के लिए ले जाएगा और मानक आउटपुट पर परिणाम देगा। इसे आवश्यकतानुसार पुनर्निर्देशित करें।

set counter 0
set expectBrace false
while {[gets stdin line] >= 0} {
    if {!$expectBrace && [regexp {^\s*MainContent\s*\((\w+)\)} $line -> bits]} {
        puts [format "Sb(%s_sb%d) \{" $bits [incr counter]]
        set expectBrace true
    }
    puts $line
    if {$expectBrace && [regexp {^\s*\}\s*$} $line]} {
        puts "\}"
        set expectBrace false
    }
}

एक छोटी राज्य मशीन (दो राज्यों, expectBrace द्वारा शासित) में राज्य परिवर्तन के लिए ट्रिगर्स का मिलान करने के लिए नियमित अभिव्यक्तियों का उपयोग करना काफी पारंपरिक पार्सिंग है। मैंने format का उपयोग Sb(…) लाइन में प्रतिस्थापन करने के लिए किया है; ये इतने सरल हैं कि यदि आप चाहें तो इसके बजाय आप सीधे प्रतिस्थापन का उपयोग कर सकते हैं।

मैंने इंडेंटेशन जोड़ने के बारे में कुछ नहीं किया है।

0
Donal Fellows 26 मार्च 2020, 12:35