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