मैं एक बहुस्तरीय पाठ फ़ाइल में घुंघराले कोष्ठक के बीच सभी पाठ को कैसे हटा सकता हूं?


10

उदाहरण:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

बन जाना चाहिए:

This is 
that wants
 anyway.

मुझे फोरम में कुछ इसी तरह के धागे मिले हैं , लेकिन वे बहु-पंक्ति घुंघराले कोष्ठक के साथ काम नहीं करते हैं।

यदि संभव हो तो, मैं कुछ एक-पंक्ति विधि पसंद करूंगा, जैसे कि grep, sed, awk ... आदि पर आधारित समाधान।

संपादित करें: समाधान ठीक प्रतीत होते हैं, लेकिन मैंने देखा है कि मेरी मूल फ़ाइलों में घुंघराले कोष्ठक शामिल हैं। इसलिए मैं एक नया प्रश्न खोल रहा हूं। आप सभी को धन्यवाद: मैं बहुस्तरीय टेक्स्ट फाइल में नेस्टेड कर्ली ब्रैकेट के बीच के सभी टेक्स्ट को कैसे हटा सकता हूं?


1
इसे आज़माएंsed '/{/{:1;N;s/{.*}//;T1}' multiline.file
कोस्टा

जवाबों:


10
$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is 
that wants
 anyway.

स्पष्टीकरण:

  • :again;$!N;$!b again;

    यह पूरी फाइल को पैटर्न स्पेस में पढ़ता है।

    :againएक लेबल है। Nअगली पंक्ति में पढ़ता है। इस शर्त पर लेबल पर $!b againवापस जाएं againकि यह अंतिम पंक्ति नहीं है।

  • s/{[^}]*}//g

    यह ब्रेसिज़ के सभी भावों को हटा देता है।

Mac OSX पर, कोशिश करें:

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

नेस्टेड ब्रेसेस

चलो इसे बहुत सारे नेस्टेड ब्रेसेस के साथ एक परीक्षण फ़ाइल के रूप में लें:

a{b{c}d}e
1{2
}3{
}
5

यहाँ नेस्टेड ब्रेसेस को संभालने के लिए एक संशोधन है:

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

स्पष्टीकरण:

  • :again;$!N;$!b again

    यह पहले जैसा ही है: यह पूरी फ़ाइल में पढ़ता है।

  • :b

    यह एक लेबल को परिभाषित करता है b

  • s/{[^{}]*}//g

    यह तब तक ब्रेसिज़ में पाठ को हटा देता है जब तक कि टेक्स्ट में कोई आंतरिक ब्रेस नहीं होता।

  • t b

    यदि उपरोक्त स्थानापन्न आदेश में परिवर्तन हुआ है, तो लेबल पर वापस जाएं b। इस प्रकार, विकल्प कमान को तब तक दोहराया जाता है जब तक कि सभी ब्रेस-ग्रुप हटा नहीं दिए जाते।


आपका जवाब सही लगता है। जब तक मैंने जो नया प्रश्न खोला है (मूल प्रश्न पढ़ें EDIT) बिल्कुल वैसा नहीं है, तो मुझे लगता है कि आपको इसका भी जवाब देना चाहिए। क्या फोरम के नियमों से यह ठीक होगा?
शोपाजो डे एरियेरेज़

@ जॉन 1024, आप अपना एडिट यहां स्थानांतरित कर सकते हैं क्योंकि ओपी उसी के संबंध में एक नया प्रश्न पोस्ट करता है।
रमेश

1
ठीक। मैंने इसे वहां पर कॉपी किया है और नए प्रश्न में नमूना पाठ का उपयोग करने के लिए इसे संशोधित किया है।
23:10 पर जॉन 1024

5

पर्ल:

perl -0777 -pe 's/{.*?}//sg' file

अगर आप इन-प्लेस को एडिट करना चाहते हैं

perl -0777 -i -pe 's/{.*?}//sg' file

यह फ़ाइल को एक स्ट्रिंग के रूप में पढ़ता है और एक वैश्विक खोज-और-जगह करता है।

यह नेस्टेड ब्रेड को संभालेगा:

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'

धन्यवाद, यह बहुत मददगार था! इसने मुझे एक निर्माण स्क्रिप्ट के साथ मिनट के भीतर एक फ़ंक्शन की सामग्री को बदलने के लिए एक समस्या को हल करने में मदद की, बनाम आह के साथ संघर्ष के साथ बनाम। और अधिक समय, फिर मैं स्वीकार करूंगा (घंटे..कफ..कफ़)
एंड्रयूड

4

एसईडी:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

{अगली पंक्ति से शुरू करें और अगली पंक्ति प्राप्त करें ( N) जब तक प्रतिस्थापन ( {}) नहीं किया जा सकता है ( Tमतलब :अगर प्रतिस्थापन नहीं है तो बनाया निशान पर वापस लौटें )

यदि एक कर्ल को एक पंक्ति में काट दिया जाए तो थोड़ा सा संशोधित हो सकता है

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

कोष्ठक में सभी प्रतीकों को निकालें ( [^}]समान हर प्रतीकright bracketsed लालची नहीं बनाने के लिए समान है ), और यदि रेखा बनी हुई है left bracked- अगर नहीं है तो अगली पंक्ति के साथ शुरू करने के लिए वापस right bracket

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.