इस w / के बारे में जाने के कुछ तरीके हैं sed। स्वीकृत उत्तर में अनुशंसित एक तरीका विलंब से पढ़ा गया है। यह भी लिखा जा सकता है:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... होल्ड बफर के साथ कहीं और लागू किए गए लुक-पीछे के बजाय थोड़ा स्पष्ट लुक-फॉरवर्ड। यह अनिवार्य रूप से अंतिम लाइन के साथ एक ही समस्या होगी कि @don_crissti नोट, हालांकि, क्योंकि लाइन चक्र N को बढ़ाता है और read कमांड लाइन नंबर द्वारा लागू किया जाता है।
आप इसे प्राप्त कर सकते हैं:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
सभी seds -मतलब मानक इनपुट की व्याख्या नहीं करेंगे , लेकिन कई करते हैं। ( POSIX का कहना है कि मानक का मतलब करने के लिए sedसमर्थन करना चाहिए -- यदि कार्यान्वयनकर्ता -मानक का मतलब चाहता है ????
दूसरा तरीका यह है कि क्रम में संलग्न सामग्री को संभालना है। एक और कमांड है जो आउटपुट को उसी तरह से शेड्यूलr करता है जैसे ead करता है, और वे sedइसे लागू करेंगे और rजिस क्रम में वे स्क्रिप्टेड हैं , उसी में रीड करेंगे । हालांकि यह थोड़ा अधिक शामिल है - यह अपनी स्क्रिप्ट में दूसरे के आउटपुट के लिए मैच को ppend sedकरने के लिए एक का उपयोग करने पर जोर देता है ।aPointersed
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और हमारे साथ इसे का पालन \newline तो आदेश a\\के लिए append एक से भी पीछा किया \newline। हमारी बड़ी Hलाइन के बाकी सभी अंतिम \nईवलाइन का अनुसरण करते हैं ।
पहले लिखी जाने वाली स्क्रिप्ट कुछ इस तरह दिखती है:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
मूल रूप से दूसरा sedहर लाइन को प्रिंट करेगा लेकिन पहला sedइसे append पर सेट करता है । उस विशेष पंक्ति के लिए दो विलम्ब से लिखी गई मानक-आउट निर्धारित हैं - पहली read है file1और दूसरी उस पंक्ति की एक प्रति है जिसे हम उसके बाद चाहते हैं। sedइस मामले में पहला डॉक्टरेट करना भी आवश्यक नहीं है (देखें? कोई बैकस्लैश) नहीं, लेकिन जब भी कोई पैटर्न मैच इनपुट के रूप में पुन: प्रस्तुत किया जाता है, तो मैं यहां से सुरक्षित रूप से बचना महत्वपूर्ण है।
वैसे भी, इसलिए ... कुछ तरीके हैं।