सैड - जगह में एक मिलान लाइन में एक चरित्र की जगह?


21

इस तरह की लाइनों वाली फाइल में:

# lorem ipsum blah variable

मैं #उसी पंक्ति में (टिप्पणी) चरित्र को निकालना चाहूंगा जिसमें एक विशिष्ट स्ट्रिंग शामिल है, जगह में। क्या इसके लिए sedअच्छा है?

मैं इस सशर्त काम पाने के लिए संघर्ष कर रहा हूं। मेरे पास ऐसा करने का एक "अनाड़ी" तरीका है; मैं के साथ awkया sedफिर एक अलग sedआदेश में इस संख्या का उपयोग कर मैचिंग लाइन नंबर पा सकता हूं , लेकिन मेरा मानना ​​है कि यह बहुत बेहतर तरीके से किया जा सकता है।

जवाबों:


36

उस स्ट्रिंग का उपयोग करें जिसे आप चयन करने के लिए लाइनों के चयनकर्ता के रूप में देख रहे हैं:

sed '/ipsum/s/#//g'

/ipsum/"ipsum" युक्त लाइनों का चयन करता है और केवल इन पंक्तियों पर कमांड (s) जो अनुसरण करते हैं निष्पादित होते हैं। आप अधिक कमांड चलाने के लिए ब्रेसिज़ का उपयोग कर सकते हैं

/ipsum/{s/#//g;s/@/-at-/g;}

4
मैं सहमत हूँ; यह सबसे अच्छा जवाब है (हालांकि केवल एक ही नहीं)। टिप्पणियाँ: (1) 's/#//g'निकाल देंगे सब# लाइन में पात्रों। यदि वह नहीं है जो आप चाहते हैं, तो g(जो "वैश्विक" है) को हटा दें । (२) किसी फ़ाइल को संपादित करने के लिए (जैसा कि प्रश्न में पूछा गया है), उपयोग करें sed -i
जी-मैन का कहना है कि 'मोनिका'

2
(३) वास्तविक दुनिया की स्थितियों के अनुसार, यदि आप किसी पंक्ति को अन-कमेंट करना चाहते हैं, तो आप sed -i '/ipsum/s/#[[:space:]]*//'किसी भी स्थान और टैब से तुरंत पीछा छुड़ाने के लिए उपयोग कर सकते हैं #। (4) आप यह सत्यापित करने पर भी विचार कर सकते हैं कि #लाइन में पहला गैर-रिक्त वर्ण है। वर्तमान कमांड #लाइन से हटा देगा prompt "Enter # of ipsums:"
जी-मैन का कहना है कि 'मोनिका'

1
@ जी-मैन - बढ़िया जोड़! : अपने 2 पॉइंट (प्रमुख अंतरिक्ष), के बारे में करने के लिए sed -i '/ipsum/s/^#[[:space:]]*//'? ( ^लाइन $के अंत के लिए लाइन की शुरुआत का संकेत देता है ) - कम से कम ग्नू सेड में ...
जेरेमी डेविस

1
@JeremyDavis: हाँ, आप पंक्ति के आरंभ में रेगेक्स को एंकर कर सकते हैं^ , लेकिन यह गलत होगा। मैं अक्सर कोड के #ठीक पहले लगाकर इंडेंट कोड कमेंट करता हूं , इसलिए #इंडेंट किया जाता है। मुझे संदेह है कि मैं एकमात्र व्यक्ति हूं जो ऐसा करता है।
जी-मैन का कहना है कि 'मोनिका'

1
@ जी-मैन - आह हाँ, बिल्कुल! धन्यवाद, मैंने ऐसा नहीं माना था। तो आप भी व्हॉट्सएप के बीच ^& के लिए जाँच करना चाहते हैं #, तो ऐसा कुछ और /ipsum/{/^[[:space:]]*#/s/#[[:space:]]*//}:। हालाँकि तब भी, जहाँ पर निर्भर करता #है, यह अभी भी समस्याएँ पैदा कर सकता है (जैसे कि व्हाट्सएप इंडेंटेशन / सेपरेशन का उपयोग करने वाली भाषाओं में)।
जेरेमी डेविस

7
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable

फिर:

$ sed 's|# \(.*blue.*\)|\1|' input.txt

देता है:

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable

यह निम्नानुसार काम करता है:

sबताता है sedकि यह क्या नियमित अभिव्यक्ति पाता है प्रतिस्थापित कर देना चाहिए।

पैटर्न है # \(.*blue.*\)जो टूट जाता है: एक हैश का पता लगाएं, उसके बाद एक स्थान है। ब्रैकेट ( \() समूहन शुरू करता है। पहले और बाद की किसी भी चीज के साथ .*blue.*शब्द है blue। अगला ब्रैकेट ( \)) समूहीकरण बंद कर देता है।

प्रतिस्थापन \1जो पहले समूहीकरण ब्रैकेट की सामग्री का एक बैक-संदर्भ है।


3

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '/ipsum/s/#//|x' file
  1. s विकल्प

  2. x सहेजें और बंद करें


यह बहुत मजेदार है। मुझे उसके बारे में पता नहीं था! टीबीएच, मुझे यकीन नहीं है कि यह इस सवाल का सबसे अच्छा जवाब है (आईएमओ प्रमुख sed उत्तर एक है) लेकिन यह अभी भी बहुत अच्छा है! पोस्ट करने का शुक्रिया।
जेरेमी डेविस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.