मैं लिनक्स में एक सीमांकक से पहले पाठ को कैसे हटा सकता हूं


16

मुझे सीमांकक से पहले एक पंक्ति से पाठ को हटाने की आवश्यकता है।

उदाहरण के लिए:

(123434): hello::{apple,orange,mango}.

मुझे पहले पाठ को हटाने की आवश्यकता है :। यानी (123434)

क्या इस कार्य को करने के लिए linux में कोई कमांड है?


आप में देखना चाहते हो सकता है sedयाawk
पॉल

क्या यह पाठ फ़ाइल का हिस्सा है, या बैश चर का हिस्सा है?
बर्नहार्ड

यह फ़ाइल का हिस्सा है।
14:80 पर user80538

जवाबों:


14

इस sedकमांड को ट्रिक करना चाहिए। निम्न आदेश फ़ाइल को अधिलेखित कर देगा:

sed -i 's/^[^:]*:/:/' file

बस आउटपुट प्रिंट करने के लिए, -iझंडे को हटा दें । आउटपुट को नई फ़ाइल में डालने के लिए, -iध्वज को हटाएं और आउटपुट को रीडायरेक्ट करें:

sed 's/^[^:]*:/:/' file > new_file

लाइन ने जादू किया ... आउटपुट को फ़ाइल में ही बदल दिया ..
user80538

जब मैं sdiff का उपयोग करके दो फ़ाइलों की तुलना करता हूं, दोनों फ़ाइलों से पाठ को हटाने के बाद, अंतर मुझे मेरे लिए हटाए गए पाठ दिखा रहा है। यह कमांड फाइल को ओवरराइट कर रहा है या सिर्फ आउटपुट दिखा रहा है।
user80538

इसने काम किया .. क्या मैं ऊपर दिए गए कमांड में साधारण बदलाव करके अपने उदाहरण से 'हैलो' और {सेब, नारंगी, आम "निकाल सकता हूं?
14:80 बजे user80538

@ user80538, जब आप इस संदर्भ में अर्क कहते हैं तो यह बताना कठिन है कि आप क्या चाहते हैं । क्या यह एक बड़ी शेल स्क्रिप्ट का हिस्सा है? आप जिस बड़ी समस्या को हल करने का प्रयास कर रहे हैं, उसके विवरण के साथ एक नया प्रश्न पूछना चाहते हैं।
डीआरएस

यह एक ही डेटा के साथ दो फ़ाइलों की तुलना में सरल है, लेकिन केवल यह खोजने की आवश्यकता है कि डेटा दो फ़ाइलों में भिन्न कहां है। मुझे लाइन में प्रत्येक व्यक्तिगत अनुभाग की जांच करने की आवश्यकता है। व्यक्तिगत अनुभागों में डेटा गड़बड़ा सकता है। जैसे {सेब, नारंगी, आम} {सेब, आम, नारंगी} हो सकते हैं।
14:80 पर user80538


5

आप इसे काफी सरल बैश निर्देश के साथ कर सकते हैं :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

यह छपेगा : hello::{apple,orange,mango}.। आप इसी तरह से उपसर्गों और प्रत्ययों को काट सकते हैं। इसके अलावा, उपसर्ग और प्रत्यय परिभाषाओं में वाइल्डकार्ड शामिल हो सकते हैं।

कट उपसर्ग - पहले उपसर्ग वाइल्डकार्ड मैच तक: ${variable#prefix}

कट उपसर्ग - पिछले उपसर्ग वाइल्डकार्ड मैच तक: ${variable##prefix}

कट प्रत्यय - पहले प्रत्यय वाइल्डकार्ड मैच तक: ${variable%suffix}

कट प्रत्यय - अंतिम प्रत्यय वाइल्डकार्ड मैच तक: ${variable%%suffix}

यह पहली नजर में अस्पष्ट लग सकता है, निम्न उदाहरण देखें:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

अंतिम उदाहरण में, पैटर्न मेल नहीं खाता है, इसलिए कुछ भी नहीं काटा जाता है।


यह उपयोग करने के लिए अधिक मजबूत होगा echo ${mytext#*:}:। यह ठीक तरह से लाइन्स को हैंडल करेगा (123)(434): hello::{apple,orange,mango}.और 123434: hello::{apple,orange,mango}
डीआरएस

क्या आपके उदाहरण में B. के बाद टेक्स्ट प्राप्त करने के लिए कमांड इको $ {mytext %% B *} को संशोधित करने का कोई तरीका है
user80538

@ user80538 हाँ, बस B से पहले पाठ को काटें, समावेशी ;-); अर्थात: पहले B के बाद पाठ के लिए $ {mytext # * B}, और दूसरे B. के बाद पाठ के लिए $ {mytext ## * B}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.