2014-07-22 4 views
28

फ़ाइल की पंक्तियों:एसईडी: एक पंक्ति को अनन्य कैसे करें जिसमें एक विशिष्ट स्ट्रिंग है? (लाइन संपादन)

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT 

बाहर टिप्पणी करने की लाइन

2001 

मैं तो बस इस एसईडी आदेश चला सकते हैं कि मान लीजिए:

sed -i '/ 2001 /s/^/#/' file 

लेकिन अब मैं वापस कैसे वापस आ सकता हूं?

समान लाइन में असुविधा के रूप में?

मैं

sed -i '/ 2001 /s/^//' file 

वह काम नहीं करता की कोशिश की।

+4

'sed -i'/2001/s/^ # // 'file' हो सकता है? –

+1

आप इस तकनीक का उपयोग क्यों कर रहे हैं? मानक तकनीक स्क्रिप्ट में एक पंक्ति का उपयोग करना होगा और वर्ष संख्या को स्क्रिप्ट के लिए तर्क में बनाना होगा। यदि आप कोई तर्क प्रदान नहीं करते हैं, तो 2001 में भी डिफ़ॉल्ट हो सकता है ('$ {1: -2001}'), या एक पर्यावरण चर ('$ {DEFAULT_YEAR: -2001}') का उपयोग करें, या दोनों ('$ {1 : - $ {DEFAULT_YEAR: -2001}} ')। –

उत्तर

33

इस sed आदेश की कोशिश करो,

sed -i '/^#.* 2001 /s/^#//' file 
+2

क्यों '.' जो पहले वर्ण को हटा देगा भले ही यह कोई टिप्पणी न हो? –

+0

@ जिडर ओप ने कहा कि यह पहले से ही टिप्पणी की गई थी। –

+2

अभी भी असफल सबूत होने की जरूरत है। अगर आपको –

3

एक अधिक सामान्य, POSIX अनुरूप समाधान के साथ @Avinash Raj's helpful answer की मदद के लिए।

  • टॉगल लाइनों कि एक specifiable स्ट्रिंग कि एक अलग शब्द लाइन पर कहीं भी रूप में होने चाहिए से मेल की टिप्पणी।
  • टिप्पणी चरित्र (स्ट्रिंग) भी निर्दिष्ट है।

ध्यान दें कि समाधान awk है, आधारित क्योंकि sed के साथ एक मजबूत पोर्टेबल समाधान POSIX 'बुनियादी नियमित अभिव्यक्ति की सीमाओं के कारण लगभग असंभव है।

awk -v commentId='#' -v word='2001' ' 
    $0 ~ "(^|[[:punct:][:space:]])" word "($|[[:punct:][:space:]])" { 
    if (match($0, "^[[:space:]]*" commentId)) 
     $0 = substr($0, RSTART + RLENGTH) 
    else 
     $0 = commentId $0 
    } 
    { print } 
    ' file > tmpfile.$$ && mv tmpfile.$$ file 
  • (^|[[:punct:][:space:]]) और ($|[[:punct:][:space:]]) POSIX \< और \> शब्द सीमा अन्य regex बोलियों से भी जाना जाता है दावे के regex समकक्ष बढ़ा रहे हैं।
  • व्हाइटस्पेस के बाद टिप्पणी चार संरक्षित है, लेकिन इससे पहले नहीं।
  • टिप्पणी पंक्ति को एक पंक्ति में अग्रिम करते समय, यह सीधे सफेद जगह के बिना तैयार किया जाता है।
  • इस प्रकार, यदि आप केवल के साथ टिप्पणियां टॉगल करते हैं तो यह समाधान है, सभी व्हाइटस्पेस संरक्षित है।
  • POSIX awk जगह-जगह अपडेट करने की पेशकश नहीं करता है (न तो POSIX sed, आकस्मिक रूप से), इसलिए आउटपुट को पहले अस्थायी फ़ाइल में कैप्चर किया जाता है और वह फ़ाइल तब सफलता पर मूल को प्रतिस्थापित करती है।
43

हाँ, एसईडी के साथ विशिष्ट स्ट्रिंग वाली लाइन टिप्पणी करने के लिए, बस कार्य करें:

sed -i '/<pattern>/s/^/#/g' file 

और यह uncomment करने के लिए:

sed -i '/<pattern>/s/^#//g' file 

आपके मामले में:

sed -i '/2001/s/^/#/g' file (to comment out) 
sed -i '/2001/s/^#//g' file (to uncomment) 

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

+0

मैकोज़ और बीएसडी –

+0

के लिए '-e' तर्क जोड़ें कई बार टिप्पणी करने से बचने के लिए और कई प्रमुख' # 'को ध्यान में रखते हुए, निम्न आदेशों का उपयोग करें: 'sed -i'//s/^ # */#/जी 'फ़ाइल (टिप्पणी करने के लिए) ' और ' sed -i '/ /s/^ # * // g' फ़ाइल (असम्बद्धता के लिए)' –

संबंधित मुद्दे