sed सभी टैब और स्पेस को एक सिंगल स्पेस से बदल देता है


23

मुझे निम्नलिखित की तरह एक स्ट्रिंग मिली:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

अब मैं सभी टैब / स्पेस को केवल एक स्पेस के साथ रिकॉर्ड इनबेट करना चाहता हूं ताकि मैं आसानी से इसका उपयोग कर सकूं cut -d " "

मैंने निम्नलिखित कोशिश की:

sed "s/[\t[:space:]]+/[:space:]/g"

और विभिन्न संस्करण लेकिन यह काम नहीं कर सका। कोई विचार?


आजमाएँ: sed -r -e "s / [\ t \] + / / g"
RJS

क्या आपका cutसमर्थन -wविकल्प है?
कोंडायबस

जवाबों:


40

उपयोग sed -e "s/[[:space:]]\+/ /g"

यहाँ एक स्पष्टीकरण है:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

अपने प्रतिस्थापन के लिए, आप केवल एक स्थान सम्मिलित करना चाहते हैं। [:space:]एक चरित्र वर्ग के लिए एक संक्षिप्त नाम के बाद से वहाँ काम नहीं करेगा और regex इंजन को पता नहीं होगा कि किस चरित्र को वहाँ रखा जाए।

+क्योंकि sed के regex इंजन के साथ regex में भाग निकले किया जाना चाहिए +एक सामान्य चरित्र जबकि है \+'एक या अधिक' के लिए एक metacharacter है। मास्टेरिंग रेगुलर एक्सप्रेशंस के पेज 86 पर , जेफरी फ्रीडल ने एक फुटनोट में उल्लेख किया है कि एड और ग्रीप कोष्ठक से बचते थे क्योंकि "केन थॉम्पसन नियमित रूप से महसूस करते थे कि इसका उपयोग मुख्य रूप से सी कोड के साथ काम करने के लिए किया जाएगा, जहां कच्चे कोष्ठक से मिलान करने की आवश्यकता बैकरेफ्रेंसिंग की तुलना में अधिक सामान्य होगी। । " मुझे लगता है कि उसने प्लस साइन के बारे में उसी तरह महसूस किया, इसलिए इसे मेटाचैकर के रूप में उपयोग करने के लिए इसे बचने की आवश्यकता है। इससे उलझना आसान है।

में sed आप से बचने के लिए की आवश्यकता होगी +, ?, |, (, और )। या उपयोग -r विस्तारित रेगेक्स का उपयोग करने के लिए (तब ऐसा दिखता है sed -r -e "s/[[:space:]]\+/ /g"याsed -re "s/[[:space:]]\+/ /g"


क्या यह टैब भी हटाता है? क्या आप समझा सकते हैं कि आप \+सिर्फ इसके बजाय क्यों इस्तेमाल करते हैं +?
ज़ुल्किस

ठीक है मैं समझ गया। [[: space:]] [\ t \ r \ n \ v \ f] के बराबर है। लेकिन क्या आप इस बात की व्याख्या कर सकते हैं कि आप क्यों इस्तेमाल करते हैं\+
ज़ुल्किस

3
[[: space:]] '\
_

2
बेसिक रेग्युलर एक्सप्रेशंस बैकस्लैश का उपयोग एक प्लस साइन से पहले करते हैं, जब इसका मतलब "पिछले चरित्र या समूह के एक या अधिक", स्रोत डेवलपर . apple.com/library/mac/#documentation/opensource/… से होता था
3molo

आह, मैं समझ गया! मुझे नहीं पता था कि अलग-अलग रेगेक्स संस्करण थे। धन्यवाद
Zulakis

6

आप -s("निचोड़") विकल्प का उपयोग कर सकते हैं tr:

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:]चरित्र वर्ग दोनों रिक्त स्थान और टैब शामिल हैं।


-2

मुझे बैश के लिए निम्न उपनाम का उपयोग करना पसंद है। दूसरों ने जो लिखा है, उस पर निर्माण, एक ही स्थान के साथ कई स्थानों को खोजने और बदलने के लिए sed का उपयोग करें। यह कटौती से लगातार परिणाम प्राप्त करने में मदद करता है। अंत में, मैं इसे एक बार बदलने के लिए स्पेस में टैब के माध्यम से चलाता हूं ताकि पढ़ने में आसान हो।

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'

यह प्रश्न का उत्तर कैसे देता है?
टोनिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.