मैं तुम्हारे लिए क्या देख रहे हैं लगता है sed
है ... यह एक रों tream एड itor जो आपको एक पंक्ति-दर-पंक्ति आधार पर प्रतिस्थापन करते हैं जाएगा।
जैसा कि आप इसे समझा रहे हैं, आदेश 'cat name.local | ग्रेप क्षेत्र 'आप एक निर्गम एक छोटे से इस तरह देता है:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
मैं तुम्हें उत्पादन कुछ इस तरह होना चाहते हैं अनुमान लगा रहा हूँ, जब से तुम आप दोहरे उद्धरण चिह्नों में पाठ की जरूरत है ने कहा:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
तो, हकीकत में, प्रत्येक पंक्ति से हम केवल डबल-कोट्स (डबल-कोट्स सहित) के बीच टेक्स्ट चाहते हैं।
मुझे यकीन नहीं है कि आप Regular Expressions से परिचित हैं, लेकिन वे एक अमूल्य टूल हैं किसी भी व्यक्ति के लिए खोल स्क्रिप्ट लिखना। उदाहरण के लिए, नियमित अभिव्यक्ति /.o.e/
किसी भी पंक्ति से मेल खाती है जहां दूसरे अक्षर वाला शब्द कम-मामला o
था, और चौथा e
था। इस तरह "zone
" स्ट्रिंग वाली शब्द से मेल खाएंगे, "tone
", या "I am tone-deaf.
"
चाल वहाँ .
(डॉट) चरित्र का इस्तेमाल किया गया "किसी भी पत्र" मतलब करने के लिए। *
जैसे कुछ अन्य विशेष पात्र हैं जिसका अर्थ है "पिछले वर्ण 0 या अधिक बार दोहराएं"। इस प्रकार a*
की तरह एक नियमित अभिव्यक्ति "a
" से मेल खाएंगे, "aaaaaaa
", या एक खाली स्ट्रिंग: ""
तो आप उपयोग कर, कोट के अंदर स्ट्रिंग से मेल कर सकते हैं: /".*"/
एक और बात आप के बारे में पता होगा नहीं है sed
(और टिप्पणियों के द्वारा, आप पहले से ही करते हैं!) - यह बैकट्रैकिंग की अनुमति देता है। एक बार जब आप इसे एक शब्द को पहचानने के बारे में बताएंगे, तो आप प्रतिस्थापन के हिस्से के रूप में उस शब्द का उपयोग कर सकते हैं। इस सूची में
Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris
: उदाहरण के लिए, मान लें कि आप इस सूची बारी करना चाहता था जाने
The Kid
The Fish
The Man
सबसे पहले, आप कोट के अंदर स्ट्रिंग के लिए देखो चाहते हैं। हमने पहले ही देखा है, यह /".*"/
था।
अगला, हम उद्धरण के अंदर क्या उपयोग करना चाहते हैं।हम समूह यह कोष्ठक का उपयोग कर सकते हैं: /"(.*)"/
अगर हम एक अंडरस्कोर से उद्धरण के साथ पाठ को बदलने के लिए चाहते थे, हम एक की जगह करना चाहते हैं: s/"(.*)"/_/
, और कहा कि हमारे साथ छोड़ना होगा:
Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris
लेकिन हमारे पास बैकट्रैकिंग है! यह हमें \1
प्रतीक का उपयोग करके, माता-पिता के अंदर क्या था याद करेगा। तो अगर अब हम करते हैं: s/"(.*)"/\1/
हम मिल जाएगा:
Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris
क्योंकि उद्धरण नहीं थे कोष्ठक में, वे \1
की सामग्री का हिस्सा नहीं थे!
केवल डबल-कोट्स के अंदर सामान छोड़ने के लिए, हमें पूरी लाइन से मिलान करने की आवश्यकता है। (। जिसका अर्थ है "पंक्ति के अंत") है कि हम ^
("पंक्ति के आरंभ" जिसका अर्थ है), और $
है
तो अब अगर हम s/^.*"(.*)".*$/\1/
का उपयोग करने के लिए, हम मिल जाएगा:
The Kid
The Fish
The Man
क्यों? के बाएं-से-दाएं नियमित अभिव्यक्ति s/^.*"(.*)".*$/\1/
पढ़ने दें:
सादे अंग्रेजी में के अंत:। "पूरी पंक्ति पढ़ें, एक तरफ डबल उद्धरण के बीच पाठ को कॉपी फिर डबल qoutes के बीच सामग्री के साथ पूरी पंक्ति की जगह।"
तुम भी पाठ s/^.*"(.*)".*$/"\1"/
की जगह के आसपास दोहरे-उद्धरण जोड़ सकते हैं, तो हम मिल जाएगा:
"The Kid"
"The Fish"
"The Man"
और वह sed
द्वारा इस्तेमाल किया जा सकता उद्धरण के भीतर से सामग्री के साथ लाइन को बदलने के लिए:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(यह सिर्फ खोल-भाग निकले डबल उद्धरण और स्लैश और सामान से निपटने के लिए है।)
तो पूरे आदेश wo की तरह कुछ हो uld:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
हाँ, मैं अभी इसका उपयोग कर रहा हूं, लेकिन मुझे लगता है कि ऐसा करने का आसान तरीका होना चाहिए, क्योंकि अब मैं sed -e/zone "// g '| sed -e's /" { // जी 'बस मध्य से मेल खाने की बजाय फ़ाइल की शुरुआत और अंत को हटाने के लिए। – jpou
शुरुआत और अंत से शेविंग पूरी तरह से स्वीकार्य है। यह कोई प्रतियोगिता नहीं है - अगर यह काम करता है, तो यह ठीक है। यदि आप उद्धरणों में पाठ से मिलान करके ऐसा करना चाहते हैं, तो 'कैप्चरिंग समूह' पर एक नज़र डालें। – zoul
उह। मैंने इसे बहुत लंबा टाइपिंग बिताया, और यह अभी भी नहीं हुआ है ... ऐसा लगता है कि हर कोई मुझे इसे मार देता है। लेकिन मुझे खुशी है कि आप इसे पहले से ही समझ चुके हैं :-) – scraimer