क्या एक पाठ फ़ाइल से दूसरी पाठ फ़ाइल में sed करना संभव है?


1

मैं अपने डेबियन बॉक्स पर एक शेल स्क्रिप्ट कोडिंग कर रहा हूं और स्क्रिप्ट पर एक पंक्ति है जो कुछ ईमेल से भरे हुए ईमेल से कुछ ईमेल को हटाने की आवश्यकता है, जैसे:

sed -i '/email01@hotmail.com\|email02@gmail.com\|email03@yahoo.com/d' /myfolder/my_email_list.txt

यह कमांड काम करता है लेकिन जैसे-जैसे यह सूची थोड़े बड़ी होती जा रही है, मैं सोच रहा था कि क्या मेरे लिए उन सभी ईमेलों को संग्रहीत करने का कोई तरीका है, जिन्हें मैं सूची (टेक्स्ट फाइल) पर हटाना चाहता हूं, क्योंकि जब मुझे नया ईमेल चाहिए जोड़ा, मैं स्क्रिप्ट को संपादित करने और अभिव्यक्ति में शामिल करने के बजाय सिर्फ सूची को संपादित करूंगा।

क्या ऐसा कुछ किया जा सकता है?

जवाबों:


0

इसमें मूल रूप से ऐसा करने का एक तरीका हो सकता है sed लेकिन यहाँ कुछ अन्य विकल्प हैं:

  1. grep

    grep -vFf badmails.txt my_email_list.txt > tempfile && 
      mv tempfile my_email_list.txt
    

    यहाँ, आप दे रहे हैं grep पैटर्न की एक सूची ( -f ) सरल स्ट्रिंग्स के रूप में उनका इलाज करने के लिए यह बताना, ( -F ) और उन पंक्तियों के लिए पूछना जो करते हैं नहीं ( -v ) उनमें से किसी से मेल खाते हैं। अंत में, आप आउटपुट को एक अस्थायी फ़ाइल पर पुनर्निर्देशित करते हैं और फिर मूल को अधिलेखित करने के लिए फ़ाइल का नाम बदल देते हैं।

  2. पर्ल

    perl -i -e 'open($f,"badmails.txt"); map{$k{$_}++}<$f>; 
                while(<>){print unless defined($k{$_})}' my_email_list.txt 
    

    यह खुलता है badmails.txt, प्रत्येक पंक्ति को कुंजी के रूप में सहेजता है हैश , फिर प्रत्येक पंक्ति के माध्यम से चलता है my_email_list.txt ( while(<>){} ) और इसे तब तक प्रिंट करता है जब तक कि एक ही लाइन (ईमेल) मौजूद न हो badmails.txt, जब तक कि इसी मान को हैश में परिभाषित नहीं किया जाता है ( print unless defined($k{$_}) )

  3. sed और खोल:

    while read badmail; do 
      sed -i sed -i "/$badmail/d" my_email_list.txt ;
    done < badmails.txt 
    

    या, उस मेल की सूची बनाने के लिए शेल का उपयोग करें जिसे आप हटाना चाहते हैं, उदा। me@mine.com\|you@yours.net और उसे पास करें sed:

    bad=$(while read b; do printf "%s\|" "$b"; done < badmails.txt|
          sed 's/\\|$//')
    sed -i "/$bad/d" my_email_list.txt 
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.