मेरे पिछले प्रश्न के बाद स्ट्रिंग्स के बीच बदलने के लिए गोलांग के रेगेक्स का उपयोग करने के बारे में . अब इसमें थोड़ी जटिलता जुड़ गई है। यहाँ मेरी फ़ाइल का संदर्भ कैसा दिखता है:

foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=*

मुझे अपनी पसंद की एक स्ट्रिंग के साथ MYSTRING= और \n के बीच की जगह को बदलने की जरूरत है (जैसा कि मूल पोस्ट में बताया गया है)। मैं इसके साथ ऐसा कर सकता हूं:

var re = regexp.MustCompile(`(MYSTRING=).*`)
s := re.ReplaceAllString(content, `${1}stringofmychoice`)

लेकिन अब मुझे एक निश्चित घटना के बाद ही मिलान करने और बदलने की जरूरत है। ताकि मेरी फाइल की सामग्री कुछ इस तरह दिख सके:

foo:
    blahblah
    MYSTRING=foostring
bar:
    blah
    blah
    MYSTRING=barstring

ReplaceAllString स्पष्ट रूप से सब कुछ बदल देता है, जो मैं नहीं चाहता। क्या किसी निश्चित स्ट्रिंग के बाद पहली घटना को केवल मिलान और प्रतिस्थापित करने का कोई तरीका है?


इस सब के बारे में थोड़ी पृष्ठभूमि के लिए। मैं किसी दी गई docker-compose.yml फ़ाइल और उसके पर्यावरण चर की सामग्री को संपादित करने के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं। मुझे पर्यावरण चर MYSTRING को अलग-अलग संपादित करने की आवश्यकता है, यह इस बात पर निर्भर करता है कि यह किस सेवा के तहत सूचीबद्ध है। ऊपर के उदाहरण में, दो अलग-अलग सेवाएं foo और bar होंगी।

1
bli00 27 फरवरी 2019, 02:27

1 उत्तर

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

आप ReplaceAllStringFunc का इस्तेमाल कर सकते हैं और रेगेक्स जैसे रेगेक्स का इस्तेमाल कर सकते हैं

(?m)^bar:(?:\n\s{4}.*)+

रेगेक्स डेमो देखें। यह एक bar ब्लॉक से मेल खाएगा, जिसमें चार व्हाइटस्पेस होंगे। फिर, एक मैच प्राप्त होने के बाद, आप मैच पर एक नियमित ReplaceAllString का उपयोग कर सकते हैं।

देखें गो डेमो:

package main

import (
    "fmt"
    "regexp"
)

const sample = `foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=*`

func main() {
    re := regexp.MustCompile(`(?m)^bar:(?:\n\s{4}.*)+`)
    re_2 := regexp.MustCompile(`(MYSTRING=).*`)
    s := re.ReplaceAllStringFunc(sample, func(m string) string {
                return re_2.ReplaceAllString(m, `${1}stringofmychoice`)
        })
    fmt.Println(s)
}

यहाँ, दूसरी घटना को bar ब्लॉक में बदला गया है:

foo:
    blahblah
    MYSTRING=*
bar:
    blah
    blah
    MYSTRING=stringofmychoice
1
Wiktor Stribiżew 27 फरवरी 2019, 00:28