बृहदान्त्र से पहले सभी पात्रों को बदलने के लिए सैड का उपयोग कैसे करें?


25

मैं निम्नलिखित स्ट्रिंग की जगह कैसे ले सकता हूं

hd_ma_prod_customer_ro:*:123456789:john.doe

john.doe के साथ

मूल रूप से मुझे अंतिम बृहदान्त्र (:) देखने की जरूरत है और इससे पहले और इसके साथ सब कुछ हटा दें।

जवाबों:


40

यह मानते हुए कि आपका वास्तव में क्या मतलब है कि आप अंतिम उपनिवेश तक सब कुछ हटाना चाहते हैं और john.doeबरकरार रखना चाहते हैं:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

स्पष्टीकरण:

पहली पंक्ति सिर्फ sedउदाहरण के लिए परीक्षण स्ट्रिंग को पाइप करती है।

दूसरा एक बुनियादी sedप्रतिस्थापन है । पहले और दूसरे के बीच का हिस्सा /खोज के लिए रेगेक्स है और दूसरे और तीसरे के बीच का हिस्सा है जो इसे बदलने के लिए है (इस मामले में कुछ भी नहीं है जैसा कि हम हटा रहे हैं)।

रेगेक्स के लिए, .किसी भी वर्ण से मेल खाता है, *यह किसी भी समय (शून्य सहित) को दोहराता है और :एक बृहदान्त्र से मेल खाता है। तो प्रभावी रूप से यह एक बृहदान्त्र द्वारा पीछा कुछ भी है। चूंकि .*एक बृहदान्त्र शामिल हो सकता है, मैच 'लालची' है और अंतिम उपनिवेश तक सब कुछ शामिल है।


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

मैं सभी घटनाओं की जगह ले रहा हूं : एक टैब के साथ और फिर awkस्ट्रिंग john.doe निकालने के लिए।

यदि आपके पास कोई फ़ाइल नहीं है, तो आप यह कोशिश कर सकते हैं।

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

ग्रीम की टिप्पणियों के अनुसार हम नीचे awkके NFचर का उपयोग करके अकेले अंतिम कॉलम को प्रिंट करने के लिए उपयोग कर सकते हैं awk

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

अनावश्यक से छुटकारा पाने के लिए ग्रीम की टिप्पणियों को शामिल करना sed

आदेश को नीचे के रूप में संशोधित किया जा सकता है।

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
यदि आप उपयोग करने जा रहे हैं awk, तो बस क्यों नहीं awk -F:?
ग्रीम

@ ग्रेमे, मैं अभी भी उस के साथ सहज नहीं हूं awk। मूल रूप से, मैं उन आदेशों का परीक्षण करने का प्रयास करता हूं जो मुझे मूल रूप से मेरे उत्तर में मिले और उपयोगकर्ता की आवश्यकता के अनुसार उन्हें संशोधित करने का प्रयास करें। :)
रमेश

3
क्षेत्र विभाजक -Fको awkनिर्दिष्ट करने का विकल्प । यदि आप awkएक कोलन का उपयोग करने के लिए कहते हैं, तो टैब के साथ कॉलनों को बदलने की कोई आवश्यकता नहीं है। इसके अलावा, आप पिछले क्षेत्र आप उपयोग कर सकते हैं प्राप्त करना चाहते हैं, तो $NFबजाय $4, इस फिर अगर वहाँ नहीं है हमेशा 3 कोलन काम करेगा।
ग्रीम

@ ग्रेमे, मैंने आपके द्वारा उल्लिखित परिवर्तनों को शामिल किया है। कृपया मुझे बताएं कि क्या यह ठीक है :)
रमेश

हाँ, पूरी तरह से काम करता है!
ग्रीम


2

प्रयास करें

संपादित करें: हटाए गए एंकर

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

और हटाने के लिए

echo 'abc:fjk' |sed 's/.*://g'

यही कारण है कि ओपी के लिए नहीं पूछ रहा है
irurar

कृपया प्रश्न को फिर से पढ़ें।
आकाश

वैसे आप मेरी टिप्पणी के बाद डिलीट कर दें, कोई बात नहीं
iruvar

ओह मैं समझा । मेरी क्षमायाचना 1_CR
akash

1
^लंगर या तो सवाल के मामले में या अपने उदाहरण मामले में कोई फर्क नहीं पड़ता। /.*पहले से शुरू होने वाले किसी भी पते का तात्पर्य है ^
माइकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.