सवाल Sed में whitespace से कैसे मिलान करें?


मैं sed में कैसे व्हाइटस्पेस मैच कर सकते हैं? मेरे डेटा में मैं 3+ बाद के व्हाइटस्पेस वर्णों (टैब स्पेस) से मेल खाना चाहता हूं और उन्हें 2 रिक्त स्थान से बदलना चाहता हूं। यह कैसे किया जा सकता है?


192
2018-02-24 11:53


मूल




जवाब:


चरित्र वर्ग \s व्हाइटस्पेस पात्रों से मेल खाएगा <tab> तथा <space>

उदाहरण के लिए:

$ sed -e "s/\s\{3,\}/  /g" inputFile

दो रिक्त स्थान के साथ कम से कम 3 सफेद जगहों के हर अनुक्रम को प्रतिस्थापित करेगा।


REMARK: POSIX अनुपालन के लिए, वर्ण वर्ग का उपयोग करें [[:space:]] के बजाय \s, क्योंकि उत्तरार्द्ध एक जीएनयू sed विस्तार है। के लिए POSIX विनिर्देश देखें एसईडी तथा बीआरईएस


200
2018-02-24 12:08



अहा! यह गायब-स्विच था जो मुझे मिला। - sequoia mcdowell
मुझे '-r' स्विच भी जोड़ना पड़ा जो अंतरिक्ष के रूप में 'एस' को पहचानने के लिए विस्तारित रेगेक्स को सक्षम बनाता है। - HUB
ऐप्पल के साथ sed मुझे उपयोग करना पड़ा [[:space:]] इसलिये \s मेरे लिए काम नहीं किया। शायद \s एक है जीएनयू sed विस्तार? - Jared Beck
@ जेरेडबेक धन्यवाद, विचारों से बाहर चल रहा था क्यों मेरा सरल रेगेक्स काम नहीं कर रहा था .. यह लंगड़ा है, मैंने सोचा था कि मानक विस्तारित रेगेक्स था .. इसके अलावा -आर काम नहीं करता है और -ई ने स्क्वाट किया - Karthik T
प्रतिक्रिया के लिए धन्यवाद। मैंने पॉज़िक्स मानक के लिंक के साथ उत्तर अद्यतन किया। - mrucci


यह मैकोज़ 10.8 पर काम करता है:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



क्या आप जानते हैं कि यह सभी लिनक्स distros पर काम करता है? - amphibient
आम तौर पर नहीं, जीएनयू sed नहीं होगा -ई। बीएसडी sed man पृष्ठ से: "-E, -a और -i विकल्प गैर-मानक फ्रीबीएसडी एक्सटेंशन हैं और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकते हैं।" - Brad Koch
+ ऑपरेटर के लिए आपको -ई ध्वज की आवश्यकता क्यों है? अधिकतर अभिव्यक्ति शायद इसके बजाय * ठीक होंगी, फिर यह अन्य प्लेटफॉर्म पर काम करेगी। - Samuel
@ सैमुएल यदि आप * का उपयोग करते हैं, तो रेगेक्स शून्य या अधिक रिक्त स्थान से मेल खाएगा, और आपको प्रत्येक पंक्ति के प्रत्येक स्थान पर एक स्थान और प्रत्येक पंक्ति के प्रत्येक स्थान पर एक स्थान मिलेगा। यदि आपके पास -ई ध्वज नहीं है, तो आप चाहते हैं sed "s/[[:space:]]\+/ /g" एक या अधिक रिक्त स्थान से मेल खाने के लिए। - jbo5112
एफडब्ल्यूआईडब्ल्यू, नेटबीएसडी के sed का समर्थन करता है -E ध्वज भी। - mcandre


Sed के कुछ पुराने संस्करण \\ एक सफेद अंतरिक्ष मिलान टोकन के रूप में पहचान नहीं सकते हैं। उस स्थिति में आप '[XZ] [XZ] *' के साथ एक या अधिक रिक्त स्थान और टैब के अनुक्रम से मेल खा सकते हैं जहां एक्स एक स्पेस है और ज़ेड एक टैब है।


13
2018-04-07 15:12



तो यहां विशेष आवश्यकता के लिए, एक पुराने sed के साथ, आप कर सकते हैं: $ sed's / [XZ] [XZ] [XZ] [XZ] * / / g 'inputfile जहां एक्स एक टैब है और ज़ेड एक स्थान है। - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



क्या यह किसी भी संस्करण पर काम करने की गारंटी है sed किसी भी प्रणाली पर? यदि नहीं, तो यह उल्लेखनीय हो सकता है कि यह अन्य उत्तरों के समान काम करता है, इसलिए हम सीमाएं जानते हैं और जहां इसका इच्छित परिणाम नहीं हो सकता है। - Mokubai♦
यह आरई वह है जो मैं व्हाइटस्पेस से मेल खाने के लिए उपयोग करता हूं। टैब या स्पेस से मेल खाने के लिए यह चरित्र वर्गों से सरल है। यह नियमित अभिव्यक्तियों के केवल सबसे बुनियादी सम्मेलनों का उपयोग करता है, इसलिए इसे नियमित अभिव्यक्तियों के कार्यात्मक कार्यान्वयन के साथ कहीं भी काम करना चाहिए। - Nate
मैक 10.9.5 पर रिक्त स्थान और 'टी' के लिए यह मैचों। मैंने व्हाइटस्पेस वर्णों से मेल खाने के लिए माइकल डौमा का उपरोक्त उपयोग किया (यह भी साथ काम करता है)। - Alien Life Form
मेरे एसयूएसई सिस्टम पर समझदारी से काम नहीं करता है। यह उस रेखा पर पहली जगह से मेल खाता है जहां शून्य या अधिक रिक्त स्थान हैं, जो पहले वर्ण से पहले है। मुझे संदेह है कि यह इरादा कार्य है, और निश्चित रूप से अनुरोधित उपयोग मामले नहीं था। मेरा मानना ​​है कि आप प्रश्न के प्रति '\ +' (या '\ {3, \}' के लिए '*' को बदलना चाहते हैं) और शायद पैटर्न के सभी घटनाओं से मेल खाने के लिए sed कमांड के अंत में एक g डाल दें। [\ T] [[: space:]] के साथ प्रतिस्थापित करना भी वांछनीय भी हो सकता है, अगर लाइन में व्हाइटस्पेस के लिए कुछ और है। - jbo5112