2009-11-25 9 views
19

का उपयोग करके हटाएं काफी निश्चित रूप से मुझे कुछ स्पष्ट याद आ रहा है!एक अलग डिलीमीटर

$ cat test.txt 
    00 30 * * * /opt/timebomb.sh >> timebomb.log 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 
$ sed ':timebomb:d' test.txt 
    00 30 * * * /opt/timebomb.sh >> timebomb.log 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

जबकि

$ sed '/timebomb/d' test.txt 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

यह मामला क्यों है? d कमांड के लिए समर्थित डिलीमीटरों का एक अलग सेट नहीं है?

+0

की संभावित डुप्लिकेट [उपयोग स्लैश की जगह sed में] (http://stackoverflow.com/questions/5864146/उपयोग-स्लैश-इन-sed-बदलें) – tripleee

उत्तर

30

आपके द्वारा उपयोग किए जा रहे delimiters //d कमांड के लिए नहीं हैं, वे पते के लिए हैं। मुझे लगता है कि आप उन्हें s/// कमांड में स्लेश से तुलना कर रहे हैं ... हालांकि हालांकि दोनों नियमित अभिव्यक्तियों से संबंधित हैं, वे अलग-अलग संदर्भ हैं।

पता फ़िल्टर जो लाइनों आदेश करने के लिए ... विकल्प (जो दिखाई आदेश के बाद) लागू किया जाता है (जो से पहले आदेश दिखाई देता है) प्रतिस्थापन लागू किया नियंत्रित करने के लिए उपयोग किया जाता है।

आपने पते में एक नियमित अभिव्यक्ति के लिए अलग सीमांकक का उपयोग करना चाहते हैं, तो आपको एक बैकस्लैश वाले का पता शुरू करने की आवश्यकता:

$ sed '\:timebomb:d' test.txt 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

(पते और विकल्पों के बीच के अंतर को समझने के लिए, पर विचार आदेश के उत्पादन:

$ sed '/timebomb/s/log/txt/' test.txt 

पता ही लाइन (रों) नियमित अभिव्यक्ति timebomb युक्त चुनता है, लेकिन विकल्प s आदेश बता नियमित अभिव्यक्ति को बदलने के लिए के साथ।)

1

कोलन sed में एक लेबल से पहले है, इसलिए आपका sed प्रोग्राम कुछ लेबल होने जैसा कुछ दिखता है। पार्सर कमांड से पहले कॉलम को डिलीमीटर के रूप में देख सकता है, इसलिए यह एक विशेष मामला है।

0

तुम सिर्फ खोल, कोई जरूरत बाहरी उपकरण

उपयोग कर सकते हैं
while read -r line 
do 
    case "$line" in 
     *timebomb*) continue;; 
     *) echo "$line";; 
    esac   
done <"file" 
संबंधित मुद्दे