sed, MarkA से हटाएं, लेकिन MarkB को शामिल न करें


1

गणित शब्द में अभिव्यक्ति, मैं एक क्षेत्र को हटाना चाहूंगा [MarkA,MarkB)। अर्थात, विलम्ब तब होता है जब कीवर्ड MarkAसामने आता है, कीवर्ड के सभी रास्ते MarkB, लेकिन उस लाइन ( MarkBकीवर्ड सहित लाइन को अछूता नहीं छोड़ा जाता है) को शामिल नहीं करता है।

क्या ऐसा करना संभव है sed?

कहो मेरा MarkAहै ^3, और MarkBहै 7,

$ seq 9 | sed '/^3/,/7/d'
1
2
8
9

यह मेरा 7डिलीट हो जाएगा लेकिन मैं इसे संरक्षित करना चाहता हूं।

अधिक सटीक होने के लिए, मैं सही तरीके से पता लगा सकता हूं MarkA(उदाहरण के लिए ^3), लेकिन मैं पहले को हटाना चाहता हूं MarkB। अर्थात,

seq 19 | sed '/^3/,/7/d'

है मैं अगर के लिए क्या देख रहा हूँ 7लाइन को हटाया नहीं गया है।


मुझे लगता है कि मैं समझता हूं कि आप क्या पूछ रहे हैं, लेकिन क्या आप एक ठोस उदाहरण दे सकते हैं? इसे बनाया जा सकता है, लेकिन एक नमूना इनपुट और अपेक्षित आउटपुट।
BLM


@choroba, लगभग, लेकिन मैं उन्हें हटाना चाहता हूं, लेकिन बाकी को संरक्षित करता हूं। आपकी स्क्रिप्ट बस उन्हें संरक्षित करती है लेकिन बाकी को हटा देती है।
17

@xpt: इसलिए मैंने केवल टिप्पणी की, आपके प्रश्न का उत्तर नहीं दिया।
कोरोबा

जवाबों:


2

Sed का उपयोग करना

यह सीमा को हटाता है, लेकिन सीमा में अंतिम पंक्ति को शामिल नहीं करता है:

$ seq 9 | sed '/^3/,/7/{/7/p;d}'
1
2
7
8
9

पहले की तरह, /^3/,/7/संपूर्ण श्रेणी का चयन करता है , जिसमें सम्मिलित है /7/। और, पहले की तरह, वह रेंज dकमांड के साथ डिलीट हो जाती है । हालाँकि, हटाने से पहले, हम यह देखने के लिए जाँच करते हैं कि क्या लाइन में है /7/और उस स्थिति में, हम इसे pकमांड से प्रिंट करते हैं ।

जाग का उपयोग करना

awk बहुत लचीलापन प्रदान करता है। यहां, हम fयह तय करने के लिए एक झंडे के रूप में एक चर का उपयोग करते हैं कि क्या लाइनें मुद्रित की जानी चाहिए:

$ seq 9 | awk '/^3/{f=1} /7/{f=0} !f'
1
2
7
8
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.