sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... प्रिंट ...
2015-01 6000
2015-02 8000
2015-03 10000
तो ऊपर मैं एक घोषित नियमित अभिव्यक्ति जो एक को परिभाषित करता है क्षेत्र के हद तक है कि एक के होते हैं *चर लंबाई वर्ण जो कर रहे हैं की एक अनुक्रम ^नहीं <अंतरिक्ष> तुरंत एक के बाद *चर लंबाई वर्ण जो कर रहे हैं की एक अनुक्रम <अंतरिक्ष> । यह घोषणा sed's पैटर्न स्पेस के खिलाफ लागू होती है, जो कि प्रत्येक ईलाइन वर्ण द्वारा एक स्ट्रिंग सीमांकित (डिफ़ॉल्ट रूप से) है \nजो इनपुट में होता है, और जिसे पुनरावृत्ति (डिफ़ॉल्ट रूप से) उसी की प्रत्येक घटना के लिए बदल दिया जाता है ।
इस घोषणा के लिए इंटरफ़ेस दो-गुना है, और प्रत्येक स्तर पर कम से कम एक अंतरराष्ट्रीय IEEE आधिकारिक मानक समिति द्वारा पूरी तरह से विनियमित और निर्दिष्ट किया गया है ताकि sedकमांड सिंटैक्स के पूर्वानुमान योग्य अनुप्रयोग को सुनिश्चित किया जा सके । उदाहरण के लिए, sedएपीआई सिंटैक्स को इस मामले में /पता /कमांड के साथ लागू किया जाता है (जो हमेशा किसी भी , sed s///हस्तांतरण कमांड का पहला घटक होता है ) , लेकिन उसी की सामग्री को एक अधिक बुनियादी एपीआई द्वारा व्याख्या की जाती है, जो इसके लिए निर्दिष्ट है। मानक सी लाइब्रेरीregcomp() में कार्य करता है ।
मैं इन बयानों आत्मविश्वास से कर सकते हैं, क्योंकि sedहै नहीं महज एक कार्यक्रम है, बल्कि निष्पादन नामित संकलित sedपर अपने यूनिक्स की तरह मशीन एक है कार्यान्वयन अच्छी तरह से परिभाषित, ऐतिहासिक स्थापित की है, और मानकों नियंत्रित sed आवेदन अपने सिस्टम के regular- की पुस्तकालयों से मेल खाते अभिव्यक्ति।
से sedकल्पना:
sedउपयोगिता Brès में वर्णित का समर्थन करेगा XBD बेसिक रेगुलर एक्सप्रेशन ...
... जहाँ हम पाते हैं ...
दोनों बीआरईएस और eres तहत POSIX.1-2008 की प्रणाली इंटरफेस मात्रा में नियमित अभिव्यक्ति मिलान इंटरफ़ेस द्वारा समर्थित हैं regcomp(), regexec()और संबंधित कार्यों।
एक एप्लिकेशन जो कॉल करता है regcomp()वह इसे एक पैटर्न स्ट्रिंग और पेश करेगा ...
... [t] वह regcomp()कार्य करता है जो नियमित रूप से स्ट्रींग में निहित अभिव्यक्ति को पैटर्न तर्क द्वारा इंगित करेगा और परिणाम को संरचना में पूर्व निर्धारित करेगा ...
उस पर कार्रवाई करने के लिए, कहा गया कि आवेदन तब regcomp()साथी समारोह का उल्लेख करेगा ...
... [टी] वह regexec()ढंग से काम अशक्त-समाप्त स्ट्रिंग द्वारा निर्दिष्ट तुलना स्ट्रिंग संकलित नियमित अभिव्यक्ति के साथ preg करने के लिए एक पिछले कॉल से प्रारंभ regcomp()...
... स्ट्रिंगregexec() के सबस्ट्रिंग के ऑफसेट के साथ [a] एरे के तत्वों को भरना होगा जो पैटर्न के कोष्ठक उप-अक्षरों से मेल खाते हैं ... पैटर्न ही सब-डेप्रेशन के रूप में गिना जाता है ...\(\)
... [टी] वह regexec()ढंग से काम सब लिखना चाहिए Nmatch के तत्वों pmatch , जहां Nmatch और pmatch आवेदन के द्वारा आपूर्ति की जाती है, भले ही के कुछ तत्वों pmatch में subexpressions के साथ संगत नहीं पैटर्न ।
और इसलिए जब मैं करता हूं ...
/[^ ]* */
... sedपहले नियमित अभिव्यक्ति संकलित करता है और परिणामों को मेमोरी में संग्रहीत करता है, फिर बाद में मेरे पैटर्न-स्पेस की सामग्री पर संकलित-ऑटोमेटन लागू करता है जितनी बार मेरी कमांड को पूरा करने के लिए आवश्यक है। हर बार जब यह परिणाम होता है, तो एक-या अधिक अशक्त-सीमांकित फ़ील्ड की एक सरणी होती है, जिसके द्वारा वापस किए गए ऑफ़सेट पर सीमांकित किया जाता है regexec()।
और जब मैं करता हूँ ...
//
... यह इंगित करने के लिए कि सबसे हाल ही में परिभाषित नियमित अभिव्यक्ति का उपयोग किया जाना चाहिए, sedबस regexec()फिर से पूर्वनिर्धारित नियमित अभिव्यक्ति का पुन: उपयोग कर कॉल कर सकते हैं , लेकिन संभवतः इसे इस बार एक बदले हुए स्ट्रिंग तर्क पर लागू कर सकते हैं या नए nmatch मापदंडों को लागू कर सकते हैं जैसा कि मैं आदेश देता हूं।
अधिक विशेष रूप से अभी भी ...
s/[^ ]* */[&]P/
- की पहली आवृत्ति को बदलने के पैटर्न एक साथ पैटर्न अंतरिक्ष में
[छोड़ दिया वर्ग कोष्ठक, तो &ही है, तो एक ]सही वर्ग ब्रैकेट एक के बाद Pचरित्र।
s//&+pc/3
- वर्तमान पैटर्न अंतरिक्ष के लिए फिर से पिछली बार उपयोग नियमित अभिव्यक्ति लागू होते हैं, और की जगह
3की तीसरी घटना पैटर्न के साथ पैटर्न अंतरिक्ष में &ही संलग्न स्ट्रिंग हो +pc।
और इसलिए sedइनपुट के प्रत्येक लाइन के लिए यह अपने stdout को लिखता है, आपका उदाहरण डेटा दिया गया है:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
यह अजीब लग सकता है, लेकिन dcकैलकुलेटर वर्ग कोष्ठक के बीच इसके इनपुट में स्ट्रिंग को उद्धृत करता है , और Pकमांड दोनों इनपुट के ढेर के बिना एक \nइवलाइन और बाद में पॉप अप करने के बिना स्टैक के शीर्ष को प्रिंट करेगा ।
और इसलिए, उदाहरण के रूप में पहली पंक्ति का उपयोग करते हुए, dcकरेंगे:
[2015-01 ]P
Pरिंट और स्टैक के शीर्ष पर पॉप करें
5000
5000स्टैक के शीर्ष पर संख्या को पुश करें और स्टैक पर वर्तमान में सभी तत्वों को धक्का दें (अब कोई नहीं) एक के बाद एक।
1000
- डिट्टो, लेकिन इस बार मुख्य स्टैक के शीर्ष पर 5000 की संख्या एक नीचे धकेल दी जाती है, और स्टैक पर दूसरा तत्व बन जाता है।
+
- स्टैक पर शीर्ष दो संख्याओं को एक साथ जोड़ें, स्टैक के उन दोनों को पॉप करें और स्टैक के शीर्ष पर योग को पुश करें।
- यह संख्या के केवल एक ढेर में परिणाम है
6000।
- यह एक सिंटैक्स त्रुटि है यदि स्टैक पर शीर्ष दो तत्वों में से एक
[स्ट्रिंग है ]।
p
pस्टैक के ऊपर से \nपॉपिंग के बिना एक संलग्न ईलाइन द्वारा पीछा किए गए स्टैक के शीर्ष को रिंट करें।
c