Sed का उपयोग करके बृहदान्त्र की पहली घटना तक हटाएं


16

मेरी sed कमांड है,

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

इसे वापस करना होगा,

bcde:cdeaf

(अर्थात) लाइन में पहले कोलन से पहले के सभी वर्ण और कॉलन को स्वयं हटाया जाना चाहिए।

लेकिन यह कुछ भी नहीं हटा रहा है।

मेरा भ्रम मुख्यतः के कारण उत्पन्न होता है,

1) क्या पैटर्न मिलान के लिए पैरेन्स को सीड रेगेक्स-एसस के अंदर भागने की जरूरत है?

2) या तो मामले में (भागने / नहीं बचने के साथ), यह एनटी काम कर रहा है। मैंने कोशिश की,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
आप चाहते हैं sed 's/[^:]*://'। और आप dइनपुट लाइन को नहीं बढ़ा रहे हैं , वैसे, आप इसे s///ऑबस्ट्रेशन कमांड के साथ संशोधित कर रहे हैं । आपको पहले नहीं बल्कि कोलन बिट और उस कॉलन को बदलना होगा जो इसके पीछे कुछ भी नहीं है।
मोकेसर सेप

वह इसे हल करता है ... धन्यवाद, यार ... यह एक उदाहरण है जिसे मैंने

3
या, बस बैश का उपयोग कर: printf "%s\n" "${line#*:}"...
jasonwryan

1
@ajonwryan - अच्छा बिंदु, उदाहरण स्रोत पर विचार करना। यह निश्चित रूप से इसे संभालने का अधिक कुशल तरीका है। लेकिन अगर यह एक while read lineहो जाता है $line, शायद sedपसंद किया जाना चाहिए।
मोकेसर

जवाबों:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

पहला ^मतलब लाइन की शुरुआत। [^:]सिर्फ एक ही तरीका है मुझे पता है कि लिखने के लिए नहीं एक कॉलन*कोलन के बाद का मतलब है किसी भी सही मेरे सामने बातें की संख्या (इस मामले नहीं-विराम में)। अंत में, :कोलन का चयन करता है।

दूसरे शब्दों में, लाइन की शुरुआत का चयन करें, किसी भी संख्या में एक कॉलोन और पहली कॉलन नहीं हैं।

//gसाधन हर मिलान किया उदाहरण को हटा दें।


3
आपको ^अपने मैच को एंकर करने की आवश्यकता नहीं है , सिवाय इसके कि आप एक gलोबेल ध्वज भी जोड़ते हैं । एक पैटर्न की केवल 1 घटना हो सकती है, और इसलिए gलॉबल ध्वज [^:]*:एक पंक्ति से सभी पैटर्न को नहीं हटाता है , क्योंकि यह ऐसा होगा यदि आपने इसे ^लंगर नहीं डाला । दो अनावश्यक झंडे के साथ रेगेक्स को उलझाने के बजाय, जो केवल एक दूसरे को असंतुलित करने की सेवा करते हैं, आप उन्हें केवल बाहर छोड़ सकते हैं, जो कि इस उत्तर के संपादित संस्करण को वापस रोल करने से पहले प्रदर्शित किया गया है। क्यों आप बुरी जानकारी के प्रसार पर जोर देंगे मुझे पता नहीं है, लेकिन यह इसे एक बुरा जवाब बनाता है।
माइकस

@ माइकर्स, जैसा कि मैंने पहले ही कहा था, इस ओर इशारा करने के लिए धन्यवाद। मैं ईमानदारी से आपको अपने sedकौशल को सुधारने में मदद करने की सराहना करता हूं । मैं sedअभी तक उठा हुआ बहुत सीमित वाक्य विन्यास से नया नहीं हूँ और अभी तक भटका नहीं हूँ। वह sed(हे), मुझे लगता है कि मेरा उत्तर ओपी की समस्या को हल करता है, भले ही यह इष्टतम (यानी, आपका) उत्तर नहीं है। यह स्टैक एक्सचेंज है, विकिपीडिया नहीं, इसलिए मुझे सही करें यदि मैं गलत हूं लेकिन यदि आपको बेहतर उत्तर का पता है तो आपको इसे पोस्ट करना चाहिए ताकि लोग विभिन्न प्रकार के दृष्टिकोण देख सकें और उनकी तुलना कर सकें। कृपया मेरे जवाब को अपने जवाब में संपादित समारोह के साथ न मोड़ें ।
user1717828

4
यह मेरा जवाब नहीं था। यह आपका उत्तर था, संपादित किया गया। बस इतना ही। और यह अच्छा था । यह अब नहीं है।
mikeserv

4

कॉलम के साथ काम करने के लिए cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

वही करते हैं

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

और अन्य संस्करण sed(बड़े डेटा के लिए अधिक त्वरित):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

और बल्कि विदेशी है bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

या

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

या

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

आप इसे sed 's/[^:]*://'
सेड के

@don_crissti संस्करण उपरोक्त उत्तर में नोट किया गया है। इसके अलावा regexp के उपयोग के कारण यह प्रत्येक पंक्ति में अभिव्यक्ति संकलित करने के लिए धीमी है।
कोस्टास

नहीं यह नहीं। ऊपर दिया गया उत्तर बड़ा समय चूसता है और बहुत से चढ़ावों का हकदार है - खासकर यदि आप संशोधन और टिप्पणियों को पढ़ते हैं।
don_crissti
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.