सैड लाइन से सभी शुरुआती पैटर्न मैचों को हटा दें


11

मेरी निम्न पंक्ति है:

abababtestab

मैं लाइन की शुरुआत से sedसभी घटनाओं को दूर करने के लिए एक अभिव्यक्ति का पता लगाने की कोशिश कर रहा हूं abताकि परिवर्तित लाइन होनी चाहिए:

testab

मुझे लगता है कि यह सरल होना चाहिए, लेकिन मैं वास्तव में इसके बारे में कुछ नहीं जानता sed

मेरे पास अब तक क्या है:

sed 's/^ab//'

लेकिन यह केवल एब की पहली घटना को हटा देता है।

जवाबों:


16
sed 's/^\(ab\)*//' <in >out

आपको इसका समूह बनाना चाहिए।

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

कुछ पुराने sedएस बहुत अच्छी तरह से संभाल नहीं कर सकते हैं, हालांकि। हालाँकि सब-एक्सप्रेशन डुप्लीकेशन BRE की एक POSIX- निर्दिष्ट विशेषता है, कुछ sedइसे ठीक से समर्थन नहीं करते हैं। उनमें से कुछ में, हालांकि ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... इसके बजाय काम कर सकते हैं।


बिल्कुल धन्यवाद के लिए मैं क्या देख रहा था! (मैं एक बार जवाब के रूप में चिह्नित करूंगा क्योंकि यह मुझे देता है)
डैन

यहां तक ​​कि sedसर्का 1979 से 7 वें संस्करण ने भी इसका समर्थन किया। समूहन को संभालने के लिए नहीं, यह एक हीन नकल होना होगा।
जोनाथन लेफ्लर

@JonathanLeffler - POSIX रेगुलर एक्सप्रेशन Rationale देखें , जो कि आंशिक रूप से, मैंने जिस पर आधारित था। शायद यह एक धारणा है, लेकिन वहां एक पैराग्राफ है ... मानक डेवलपर्स ने सामान्य ऐतिहासिक व्यवहार पर विचार किया, जिसने समर्थन किया \n*, लेकिन नहीं \n\{min,max\}\(...\)*, या \(...\)\{min,max\}, एक विशिष्ट कार्यान्वयन के गैर-इरादतन परिणाम के रूप में, और उन्होंने उप-संदर्भों और बैक-रेफरेंस के बाद दोहराव और अंतराल दोनों अभिव्यक्तियों का समर्थन किया।
mikeserv

@JonathanLeffler: यह हिरलूम टूलचैस्ट से सेड संस्करण के साथ भी काम नहीं करता है।
congonglm

@cuonglm - \(ab\)\1*संस्करण w / डिफ़ॉल्ट वारिसोम काम करता है sed, और \(ab\)*संस्करण w / SuSv4 उत्तराधिकार काम करता है sed। कम से कम, यह मेरे निर्माण के लिए करता है। निश्चित रूप से, मैंने अपने हेयरलूम सेट का निर्माण मसल लिब सी के खिलाफ किया था, और इसलिए मैं सोच सकता हूं कि इससे अलग व्यवहार हो सकता है। लेकिन आमतौर पर जब एक निर्दिष्ट सुविधा एक वारिसलूम SuSv4 heirloom टूल में काम करती है, लेकिन डिफ़ॉल्ट टूल में नहीं, यह इसलिए है क्योंकि देव ने इसे बनाया है।
mikeserv

6

एक और sed:

sed -e ':1' -e 's/^ab//;t1'

इनपुट की प्रत्येक पंक्ति के साथ, हम एक लेबल सेट करते हैं :1, फिर लाइन की शुरुआत में substration करते हैं ab। यदि substration सफलतापूर्वक है, तो test कमांड ब्रांच को लेबल करने के लिए 1, जब तक कोई abपैटर्न लाइन के शुरू में प्रकट नहीं होता है, तब तक कार्य को फिर से करें ।


मेरे विचार से भी। कड़ाई से, आपको परीक्षण करने की आवश्यकता नहीं है: s/^ab//; t1
ग्लेन जैकमैन

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