इस w / के बारे में जाने के कुछ तरीके हैं sed
। स्वीकृत उत्तर में अनुशंसित एक तरीका विलंब से पढ़ा गया है। यह भी लिखा जा सकता है:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... होल्ड बफर के साथ कहीं और लागू किए गए लुक-पीछे के बजाय थोड़ा स्पष्ट लुक-फॉरवर्ड। यह अनिवार्य रूप से अंतिम लाइन के साथ एक ही समस्या होगी कि @don_crissti नोट, हालांकि, क्योंकि लाइन चक्र N
को बढ़ाता है और r
ead कमांड लाइन नंबर द्वारा लागू किया जाता है।
आप इसे प्राप्त कर सकते हैं:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
सभी sed
s -
मतलब मानक इनपुट की व्याख्या नहीं करेंगे , लेकिन कई करते हैं। ( POSIX का कहना है कि मानक का मतलब करने के लिए sed
समर्थन करना चाहिए -
- यदि कार्यान्वयनकर्ता -
मानक का मतलब चाहता है ????
दूसरा तरीका यह है कि क्रम में संलग्न सामग्री को संभालना है। एक और कमांड है जो आउटपुट को उसी तरह से शेड्यूलr
करता है जैसे ead करता है, और वे sed
इसे लागू करेंगे और r
जिस क्रम में वे स्क्रिप्टेड हैं , उसी में रीड करेंगे । हालांकि यह थोड़ा अधिक शामिल है - यह अपनी स्क्रिप्ट में दूसरे के आउटपुट के लिए मैच को ppend sed
करने के लिए एक का उपयोग करने पर जोर देता है ।a
Pointer
sed
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
इसलिए मूल रूप से पहला sed
दूसरा sed
स्क्रिप्ट लिखता है , जो दूसरा sed
मानक-इनपुट (शायद ...) पर पढ़ता है और बदले में लागू होता है। पहले sed
केवल पहले मैच के लिए काम करता Pointer
है, और उसके बाद q
इनपुट का उपयोग करता है। इसका काम है ...
s/[]^$&\./*[]/\\&/g;H
- सुनिश्चित करें कि सभी पैटर्न चार्ट सुरक्षित रूप से बैकस्लैश-बच गए हैं क्योंकि दूसरे
sed
को हर बिट की व्याख्या करने की आवश्यकता है जो इसे सही ढंग से प्राप्त करने के लिए सचमुच पढ़ता है। एक बार हो जाने के बाद, H
पुरानी जगह पर एक कॉपी रख दें ।
s|.*|/&/!p;//!d|p; x
- हर इनपुट लाइन
sed
को p
रिंट करने के लिए दूसरे को बताएं, !
लेकिन /&/
हम सिर्फ पैटर्न-सेफेड हैं; और फिर d
सभी समान करने के लिए। p
दूसरे नंबर पर कमांड को रिंट करें sed
, फिर हमारी सेव की हुई कॉपी पर काम करने के x
लिए h
पुराने और पैटर्न बफ़र्स को बदलें ।
s|.|r file1&a\\&|p;q
- हमारे यहां काम करने वाला
\n
एकमात्र चार्ट एक ईवलाइन है, क्योंकि sed
जब हम H
लाइन को पहले से बड़ा करते हैं, तो एक पूर्वनिर्मित होगा । तो हम आदेश डालने r file1
और हमारे साथ इसे का पालन \n
ewline तो आदेश a\\
के लिए a
ppend एक से भी पीछा किया \n
ewline। हमारी बड़ी H
लाइन के बाकी सभी अंतिम \n
ईवलाइन का अनुसरण करते हैं ।
पहले लिखी जाने वाली स्क्रिप्ट कुछ इस तरह दिखती है:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
मूल रूप से दूसरा sed
हर लाइन को प्रिंट करेगा लेकिन पहला sed
इसे a
ppend पर सेट करता है । उस विशेष पंक्ति के लिए दो विलम्ब से लिखी गई मानक-आउट निर्धारित हैं - पहली r
ead है file1
और दूसरी उस पंक्ति की एक प्रति है जिसे हम उसके बाद चाहते हैं। sed
इस मामले में पहला डॉक्टरेट करना भी आवश्यक नहीं है (देखें? कोई बैकस्लैश) नहीं, लेकिन जब भी कोई पैटर्न मैच इनपुट के रूप में पुन: प्रस्तुत किया जाता है, तो मैं यहां से सुरक्षित रूप से बचना महत्वपूर्ण है।
वैसे भी, इसलिए ... कुछ तरीके हैं।