यदि आप 1 या अधिक गैर-रिक्त वर्णों के किसी भी अनुक्रम का अर्थ करने के लिए शब्द अर्हता प्राप्त करते हैं तो उत्तर निश्चित रूप से हाँ है, और यह बहुत ही सरल रूप से किया जाता है। इसका कारण यह है और बूलियन कंपार्टमेंट हैं और - बशर्ते एक स्ट्रिंग में सभी वर्ण पूर्ण हों - यू किसी भी संभव स्ट्रिंग का वर्णन उसी तरह से कर सकता है जैसे वह करता है।[[:blank:]]*
[^[:blank:]]*
[[:blank:]]*
[^[:blank:]]*
.*
यदि एक अधूरा चरित्र या अन्यथा अमान्य बाइट अनुक्रम एक स्ट्रिंग के भीतर मौजूद है, तो न तो सफलतापूर्वक इसे पूंछ के लिए सिर का वर्णन कर सकता है - जैसा कि कभी-कभी गलत एन्कोडिंग में स्ट्रिंग की व्याख्या करते समय हो सकता है। किसी भी स्ट्रिंग में बाइट प्रति पूर्ण चरित्र सुनिश्चित करने के लिए, सी लोकेल को मजबूर किया जा सकता है:
LC_ALL=C sed ...
... जो किसी भी मुद्दे को सिर से पूंछ तक स्ट्रिंग जैसे सर्व-समावेशी पैटर्न जैसे .*
या के साथ बताने से बचता है([ ]*[^ ]*)*
एक पूरी तरह से पूरक पैटर्न के रूप में कई बार दोहरा सकते हैं जैसा कि पैटर्न में किसी भी ब्रेक के बिना अंतिम संभव घटना पर उतरने के लिए किसी भी स्ट्रिंग की लंबाई के लिए बाएं से दाएं आवश्यक है। यह निश्चित रूप से, नियमित भाषा है।
BRE:
sed 's/\(\([^[:blank:]]*\)[[:blank:]]*\)*/\2/'
ERE:
sed -E 's/(([^[:blank:]]*)[[:blank:]]*)*/\2/'
ये दोनों संस्करण अभी भी रिक्त लाइनों को मुद्रित करेंगे, और इसका कारण यह है कि क्लेन *
स्टार एक पैटर्न के शून्य या अधिक घटनाओं से मेल खाता है। यह पहले शून्य या अधिक नहीं रिक्त पात्रों से मेल खाता है, फिर शून्य या अधिक रिक्त वर्ण, फिर समूहबद्ध मैचों के शून्य या अधिक घटनाएँ जब तक कि यह अपनी संपूर्णता में स्ट्रिंग से मेल नहीं खाता है।
इस सब से मेल खाने के बाद, जादू प्रतिस्थापन में होता है - समूह द्वारा दिए गए संदर्भ \1
और \2
प्रत्येक की अंतिम घटनाएं होती हैं। इसलिए जब प्रतिस्थापन किया जाता है तो सभी स्ट्रिंग को केवल शून्य या अधिक रिक्त वर्णों की एक पंक्ति पर अंतिम घटना से बदल दिया जाता है - या उपसमूह \2
।
बेशक यह किसी भी संभावित स्ट्रिंग के लिए काम करता है - यहां तक कि एक खाली भी - जिसका अर्थ है कि दोनों रूप उन लाइनों के लिए नईलाइन वर्णों को प्रिंट करेंगे जिनमें केवल खाली अक्षर हैं या कोई भी नहीं है। इसे संभालने के लिए कुछ चीज़ें हैं जो आप कर सकते हैं, लेकिन पहले अक्षर वर्ग को टाइप करने के लिए थोड़ा आसान करें:
b='[:blank:]'
अब, केवल प्रिंट करने के लिए यदि एक पंक्ति में एक या अधिक रिक्त अक्षर नहीं हैं, जो आप कर सकते हैं:
BRE:
sed -n "s/\(\([^$b]*\)[$b]*\)*/\2/;/./p"
ERE:
sed -En "/[^$b]/s/(([^$b]*)[$b]*)*/\2/p"
- BRE मामला - प्रतिस्थापन हमेशा किया जाता है और कम से कम एक शेष चरित्र के साथ केवल पैटर्न रिक्त स्थान मुद्रित होते हैं।
- ईआरई मामला - प्रतिस्थापन केवल कभी कम से कम एक नहीं चार चार पैटर्न पैटर्न पर प्रयास किया जाता है।
या तो फार्म या तो विधि के साथ काम करेगा - जब तक वाक्य रचना सही है।
-n
स्विच से अक्षम ऑटो मुद्रण पैटर्न अंतरिक्ष की, और p
करने के लिए ध्वज s///
ubstitution या /
पते के /
आदेशों उसके परिणामों को केवल तभी सफल प्रिंट करता है।
यह वही तर्क किसी भी {num}
घटना को प्राप्त करने के लिए लागू किया जा सकता है , साथ ही, जैसे:
BRE:
sed -n "s/\([$b]*\([^$b]\{1,\}\)\)\{num\}.*/\2/p"
ERE:
sed -En "s/([$b]*([^$b]+)){num}.*/\2/p"
... जहाँ num
दोनों regexps में {num}
रिक्त वर्णों के अनुक्रम के केवल वें निर्दिष्ट घटना को मुद्रित करने के लिए एक संख्या के साथ प्रतिस्थापित किया जा सकता है । एक स्ट्रिंग में अग्रणी स्थान के लिए गिनती तिरछी नहीं है यह सुनिश्चित करने के लिए यहां थोड़ा अलग रूप का उपयोग किया जाता है।
ध्यान दें कि -E
ERE स्विच sed
BSD और GNU दोनों संस्करणों में समर्थित है, हालाँकि यह अभी POSIX मानक सिंटैक्स नहीं है।
sed
?