कैसे एक बहु लाइन कोड को sed के साथ बदलें?


9

मेरे पास एक बड़ी फाइल है जिसमें उसके विशेष पात्र हैं। वहां एक मल्टी लाइन कोड है, जिसे मैं बदलना चाहता हूं sed

इस:

  text = "\
    ------                                                           ------\n\n\
    This message was automatically generated by email software\n\
    The delivery of your message has not been affected.\n\n\
    ------                                                           ------\n\n"

इसे चालू करने की आवश्यकता है:

text = ""

मैंने निम्नलिखित कोड की कोशिश की, लेकिन कोई भाग्य नहीं:

sed -i '/  text = "*/ {N; s/  text = .*affected.\./  text = ""/g}' /etc/exim.conf

यह कुछ भी प्रतिस्थापित नहीं करता है और किसी भी त्रुटि संदेश को प्रदर्शित नहीं करता है

मैं इसके साथ खेल रहा हूं, लेकिन मैं जो भी कोशिश करता हूं वह काम नहीं करता है।


क्या यह होना चाहिए sedया आप अन्य उपकरणों के लिए खुले हैं? क्या ब्लॉक के "अंदर हो सकता है text=? क्या text = आपकी फ़ाइल में अन्य मामले हो सकते हैं ? क्या हमेशा पाठ की 4 लाइनें होंगी या कम / ज्यादा हो सकती हैं?
terdon

अधिमानतः sed, या कुछ भी जिसे CentOS सर्वर में इंस्टॉलेशन की आवश्यकता नहीं है। बॉक्स टूल्स से बाहर
ब्लेड 19899

@terdon text = फ़ोल्डर में अन्य नहीं हैं , बाहर आने की जरूरत है text = ""। फ़ाइलों में कोड की 891 लाइनें हैं। इसलिए, इसे दूसरे पाठ का सम्मान करना चाहिए।
ब्लेड 19899

क्या आप फ़ाइल को अधिलेखित करना चाहते हैं या केवल आउटपुट को संशोधित करना चाहते हैं?
joH1

@Mststroke कोई ओवरराइट नहीं। यह सिर्फ पाठ को बदलने की जरूरत है - जैसा कि मेरे प्रश्न में देखा गया है - को text = ""। जैसा कि मेरे प्रश्न में देखा गया है।
ब्लेड 19899

जवाबों:


15

बचाव के लिए पर्ल:

perl -i~ -0777 -pe 's/text = "[^"]+"/text = ""/g' input-file
  • -i~ फ़ाइल को "जगह" में संपादित करेगा, एक बैकअप प्रति छोड़कर
  • -0777 एक बार में पूरी फाइल पढ़ता है, लाइन से नहीं

प्रतिस्थापन s///उसी तरह से काम करता है जैसा कि sed (यानी यह text = "कुछ भी लेकिन डबल कोट्स कई बार एक दोहरे उद्धरण से मेल खाता है) के रूप में काम करता है , लेकिन इस मामले में, यह पूरी फाइल पर काम करता है।


5

यदि आप Nइसका मिलान नहीं करते हैं तो आपको पैटर्न स्पेस की जांच करनी होगी और एक्सट्रीम लाइन में खींचते रहना होगा

sed '/text = "/{              # if line matches text = "
:b                            # label b
$!N                           # pull in the next line (if not the last one)
/"$/!bb                       # if pattern space doesn't end with " go to label b
s/".*"/""/                    # else remove everything between the quotes
}' infile

साथ gnu sedआप इसे के रूप में लिख सकते हैं

sed '/text = "/{:b;$!N;/"$/!bb;s/".*"/""/}' infile

हालांकि यह बहुत कुशल नहीं है, बस बेहतर रेंज का चयन करें /text = "/,/"/, पहली पंक्ति को संशोधित करें और बाकी को हटा दें:

sed '/text = "/,/"/{            # in this range
/text = "/!d                    # delete all lines not matching text = "
s/\\/"/                         # replace the backslash with quotes (this is only
}' infile                       # executed if the previous d wasn't executed)

फिर से, gnu sedआप इसे एक-लाइनर के रूप में लिख सकते हैं:

sed '/text = "/,/"/{/text = "/!d;s/\\/"/}' infile

3

व्यक्तिगत रूप से, मैं पर्ल में ऐसा करूंगा। यदि हम यह मान सकते हैं कि "समापन से पहले कोई नहीं है ", तो आप कर सकते हैं:

perl -0pe 's/(text\s*=\s*)".*?"/$1""/s' file

-0पूरी फ़ाइल slurps, स्मृति में इसे पढ़ने के। -p"द्वारा दी गई स्क्रिप्ट को लागू करने के बाद" प्रत्येक पंक्ति (यहां, एक "लाइन" पूरी फ़ाइल होगी) का अर्थ है -e। स्क्रिप्ट ही एक साधारण प्रतिस्थापन संचालक है। यह text0 या अधिक व्हाट्सएप वर्णों, =और (0 या अधिक व्हाट्सएप text\s*=\s*) के बाद स्ट्रिंग को फिर से कैप्चर करेगा ( ) और इसे सेव करें $1। फिर, यह कैप्चर किए गए पैटर्न के साथ-साथ पैटर्न ( $1) और के साथ कम से कम उद्धृत स्ट्रिंग की जगह लेगा ""sझंडा बनाता .मैच नई-पंक्तियों।


सुधार, -00पैराग्राफ में पढ़ता है, न कि पूरी फ़ाइल ( रेफ )। यदि उद्धरणों में पाठ में एक रिक्त रेखा है, तो रेगेक्स मेल नहीं खाएगा।
ग्लेन जैकमैन

@glennjackman argh! मैं हमेशा उन लोगों को मिलाता हूं। । यही कारण है कि मैं वास्तव में एक अतिरिक्त पैराग्राफ जोड़कर और चलाकर दोहरी जाँच करता हूँ perl -00ne 'print;exit'। और मैंने अभी भी गलत जवाब दिया! धन्यवाद, अब तय किया गया।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.