2011-08-13 11 views
8

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

यह मैं क्या मिल गया है, लेकिन यह एकदम सही ढंग से काम नहीं कर रहा:

KEYWORD='domain.com' 
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts 

अद्यतन

यह वही मेरे लिए काम किया है:

sed -i_bak -e '/domain\.com/d' /etc/hosts

हालांकि, क्योंकि मेरे पास "domain.com" के साथ दो पंक्तियां थीं, क्या केवल उस पंक्ति को मिटाने के लिए sed कहने का एक तरीका है जहां सटीक कीवा है ord "domain.com" प्रकट होता है

यह/etc/hosts की मूल सामग्री है:

127.0.0.1  localhost  localhost.localdomain 
222.111.22.222  hvn.domain.com 
222.111.22.222  domain.com 

यहाँ कैसे यह आदेश sed -i_bak -e '/domain\.com/d' /etc/hosts के बाद अंततः है:

127.0.0.1  localhost  localhost.localdomain 

मैं sed -i_bak -e '/\<namourphoto\.com\.br\>/d' ~/Desktop/hosts कोशिश की, लेकिन यह काम नहीं किया।

D=domain.com 
DOMAIN=`echo "$D" | sed 's/\./\\\\./g'` 
sed -i_bak -e "/[\t]$DOMAIN/d" /etc/hosts 

ध्यान दें कि:

  • मैं

    निष्कर्ष

    इस कोड के साथ मैं (मदद ठीक लोगों ने मुझे दे दिया है के आधार पर) आया है मैं गिन रहा हूं कि डोमेन को मिटाए जाने से पहले हमेशा एक टैब होता है

  • मैं स्वचालित रूप से डोमेन नाम के बिंदुओं से बच रहा हूं।

+2

कृपया ध्यान दें कि डॉट regexps में विशेष अर्थ नहीं है तो 'domain.com' भी' domainxcom.net' से मेल खाएगी अपने उदाहरण की अंतिम पंक्ति को हटाना चाहते हैं। आपको डॉट से बच जाना चाहिए। – duri

+0

क्या मुझे '' के बीच भी डॉट्स से बचना चाहिए? – Roger

+0

हाँ, आप करते हैं। 'Echo abc | कोशिश करें grep 'a.c'', आउटपुट 'abc' होगा। – duri

उत्तर

13

उपयोग stream editor, SED:

sed -i ".bak" '/culpa/d' test.txt 

ऊपर नष्ट करेगा लाइनों test.txt में प्रमाद हैं। यह मूल का बैकअप बनाएगा (test.txt.bak नाम दिया गया है) और मूल फ़ाइल को जगह में संशोधित करेगा।

+0

कि कमाल है। – djhaskin987

+1

मेरे परीक्षण -i और .bak के बीच की जगह के साथ काम नहीं किया था। लेकिन जब मैं पु-आई। बाक ने काम किया। – Roger

+0

बैकअप के बिना मूल को छोड़ते समय आप यह कैसे करते हैं? अद्यतन: बस अपने प्रश्न का उत्तर देने के लिए ".bak" उद्धरण खाली बना दिया। –

5

पाइप इसे किसी अन्य फ़ाइल, नहीं एक ही एक है कि आप से पढ़ रहे हैं, और cat की बेकार उपयोग के साथ सावधान रहना।

grep -v "$KEYWORD" /etc/hosts > newfile 

अलावा के बारे में दिए गए ठीक जवाब से एसईडी, आप भी हल करने के लिए इस पर्ल और एक छोटे से बेहतर regex का उपयोग कर सकते हैं:

perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file 

सूचना मैं domain.com पर विचार कर रहा हूँ द्वारा अलग किया जाएगा स्पेस कैरेक्टर (टैब या रिक्त स्थान, आदि), और कुछ भी नहीं, लेकिन शून्य या अधिक रिक्त स्थान इसके बाद नई लाइन तक दिखाई देंगे। इसी तरह से -i में,
-i.old परल में $^I चर सेट करता है, और आपकी मूल फ़ाइल में परिवर्तन प्राप्त होंगे जबकि प्रतिलिपि पुराने नाम के तहत रखी जाएगी और .old संलग्न होगा।

+0

क्या इस दृष्टिकोण के साथ जगह में संपादित करने का कोई तरीका है या इसे संपादित करने के लिए मुझे हमेशा एक और फ़ाइल बनाने की आवश्यकता है? – Roger

+0

@Roger, मैंने जवाब अपडेट किया। – sidyll

+0

आपका कोड बहुत सुंदर है, धन्यवाद। – Roger

1

आप केवल फाइल

sed -i '/[[:space:]]\+domain\.com/d' test.txt 
संबंधित मुद्दे