बाश में [[: space:]] का क्या अर्थ है?


23

मुझे बस एक बैश स्क्रिप्ट मिली। [[:space:]]बैश स्क्रिप्ट में क्या मतलब है? डबल कालोनी क्यों?

जवाबों:


35

यह वास्तव में, है, पार्टी के मैनुअल में है, लेकिन यह पता करने के लिए आप के लिए है, जो जो खोज रहे हैं मदद करता है नहीं है यदि आप नहीं जानते कि आप देख रहे हैं मददगार। यदि आप खोजते हैं तो आप सशर्त अभिव्यक्ति अनुभाग से [[विचलित हो जाएंगे [[ expression ]]। इसके अतिरिक्त, :space:एक ही खंड के अंतर्गत आपको दो उदाहरणों में भूमि की खोज करना । आप उस उदाहरण में ब्रेडक्रम्ब का अनुसरण कर सकते हैं:

उदाहरण के लिए, निम्नलिखित एक रेखा से मेल खाएगा (शेल वैरिएबल लाइन में संग्रहीत) यदि किसी संख्या के मूल्य में वर्णों का अनुक्रम है, जिसमें शून्य वर्ण, अंतरिक्ष वर्ण, शून्य या 'a' के एक उदाहरण शामिल हैं, तो a 'बी':

[[ $line =~ [[:space:]]*?(a)b ]]

... जिससे आप एक साथ टुकड़े कर सकते हैं कि [[:space:]]भाग "अंतरिक्ष वर्ण" के अनुरूप है, लेकिन आपको यह सोचने के लिए क्षमा किया जा सकता है कि यह केवल एक शाब्दिक स्थान वर्ण था और वर्णों का एक पूरा वर्ग नहीं, जो कि यह प्रतिनिधित्व करता है।

यदि आप ( bash।" space" ) स्ट्रिंग के लिए खोज करते हैं (जो कि, ऑनलाइन बैश मैनुअल में "स्पेस" शब्द के बाद का स्थान है) , तो केवल 32 मैचों से गुजरने के लिए "केवल" हैं। दसवें के बारे में एक यहाँ होगा:

'[' और ']' 'के भीतर, वर्ण वर्गों को वाक्य रचना [: वर्ग:] का उपयोग करके निर्दिष्ट किया जा सकता है, जहां कक्षा POSIX मानक में परिभाषित निम्नलिखित वर्गों में से एक है:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

एक चरित्र वर्ग उस वर्ग से संबंधित किसी भी चरित्र से मेल खाता है।

जो तब आपको POSIX मानक पर ले जाएगा जहां आप "वर्ण वर्ग" शब्द खोज सकते हैं और पा सकते हैं

wctype, wctype_l - वर्ण वर्ग को परिभाषित करते हैं , जो आपको जहाँ तक मिलता है:

Wctype () [CX] [ऑप्शन स्टार्ट] और wctype_l () [ऑप्शन एंड] फ़ंक्शन वर्तमान लोकेल [CX] [ऑप्शन स्टार्ट] में वर्ण प्रकार की जानकारी द्वारा परिभाषित कोडित वर्ण सेट के नियमों के अनुसार wctype_t के मूल्यों को निर्धारित करेगा। या लोकेल द्वारा दर्शाए गए स्थान में, [विकल्प अंत] क्रमशः (श्रेणी LC_CTYPE)।

यदि आपने तब सेटलोकाले लिंक का अनुसरण किया है , तो आप अंत में लोकल सेक्शन में अपने वास्तविक उत्तर के लिए पहुंच जाएंगे :

अंतरिक्ष

वर्णों को श्वेत-स्थान वर्णों के रूप में वर्गीकृत करने के लिए परिभाषित करें। POSIX लोकेल में, वास्तव में <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>शामिल किया जाएगा।

स्थानीय परिभाषा फ़ाइल में, ऊपरी, निचले, अल्फा, अंक, ग्राफ़, या xdigit कीवर्ड के लिए निर्दिष्ट कोई वर्ण निर्दिष्ट नहीं किया जाएगा। <space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>पोर्टेबल वर्ण सेट, और कक्षा खाली में शामिल किसी भी पात्रों में से स्वचालित रूप से इस वर्ग में शामिल किए गए हैं।


1
LESS=+'/Within \[ and \],' man bash32 nएक्सट्रीम कमांड्स :-) के बजाय मैनुअल मैच खोजने में आसान ।
इसहाक

5
@ आइसाक मुझे लगता है कि आदमी को मछली को कैसे सिखाना है। उस ने कहा, मैं इसके बारे में नहीं जानता था less +"$cmd", इसलिए इसके लिए धन्यवाद।
JoL

3
वास्तव में, मैंने ओपी के दृष्टिकोण को देखते हुए उत्तर दिया; उन्हें यह नहीं माफ करने के लिए माफ किया जा सकता है कि बाहरी []भीतर से स्वतंत्र हैं []। मैंने कोशिश की जाने बिना जवाब देने के लिए प्रश्न से एक रास्ता खोजने के लिए (!) बहुत अधिक के बारे में क्या जवाब था, हालांकि यह कुछ भाग्यशाली अनुमान लगाने :) ले लिया
जेफ स्कालर

17

यह न केवल बैश के लिए है, यह पोसिक्स नोटेशन का हिस्सा है।

POSIX क्या है?

POSIX या "यूनीएक्स के लिए पोर्टेबल ऑपरेटिंग सिस्टम इंटरफ़ेस" मानकों का एक संग्रह है जो कुछ कार्यक्षमता को परिभाषित करता है जो एक (UNIX) ऑपरेटिंग सिस्टम को समर्थन करना चाहिए। इन मानकों में से एक नियमित अभिव्यक्ति के दो स्वादों को परिभाषित करता है।

POSIX ब्रैकेट अभिव्यक्तियाँ

POSIX ब्रैकेट अभिव्यक्ति एक विशेष प्रकार की वर्ण कक्षाएं हैं। POSIX ब्रैकेट एक्सप्रेशन नियमित वर्ण वर्गों की तरह, वर्णों के एक सेट से एक वर्ण से मेल खाता है।

मानक POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits

कोई भी मानक नहीं

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)

विरासत वाक्य रचना (क्या कोई इनका संदर्भ खोज सकता है?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word

आप अधिक जानकारी यहाँ पा सकते हैं: विकी


1
[[:ascii:]], और [[:word:]]पोसिक्स क्लासेस नहीं हैं (वे बहुत ही अच्छे लगते हैं bash), और मैं नहीं ढूँढ सकता [[:<:]]और न ही [[:>:]]। एक बेहतर संदर्भ हो सकता है pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
Kusalananda

1
हाँ, [[:ascii:]]और [[:word:]]कोई भी मानक POSIX कक्षाएं नहीं हैं। के लिए [[:<:]]और [[:>:]], मुझे कोई संदर्भ नहीं मिल रहा है, लेकिन यह वही है \ben.wikipedia.org/wiki/Regular_expression#Character_classes
नीमा


[[:<:]]FreeBSD में भी है, PostgreSQL के रूप में एक ही चेतावनी के साथ: freebsd.org/cgi/…
ilkkachu

1
और [[:ascii:]]और [[:word:]]पैटर्न मिलान में बैश में पाठ्यक्रम काम के नहीं, बल्कि नियमित अभिव्यक्ति में (अपने सिस्टम पर कम से कम, मैं बैश सिस्टम के regex पुस्तकालय का उपयोग करता है लगता है)। बाह।
इल्काचू

9

नियमित अभिव्यक्ति और फ़ाइल नाम ग्लब्स / शेल पैटर्न में, [...]निर्माण कोष्ठक के भीतर सूचीबद्ध लोगों के किसी एक चरित्र से मेल खाता है। उन कोष्ठकों के भीतर, कई मानक चरित्र वर्ण वर्गों के नाम का उपयोग किया जा सकता है। उनमें से एक है [:space:], जो व्हाट्सएप के पात्रों से मेल खाता है (जैसे \sपर्ल रेगेक्स में)। बैश नियमावली में देखें उदाहरण पैटर्न मिलान

तो, [[:space:]]एक नियमित अभिव्यक्ति या पैटर्न मैच का एक हिस्सा है, जो सिर्फ व्हाट्सएप से मेल खाता है।

उदाहरण के लिए एक पैटर्न मैच (मानक शेल, बैश-विशिष्ट नहीं):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac

या रेगेक्स (बाश):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi

ध्यान दें कि भले ही ब्रैकेट एक्सप्रेशन [...]रेगुलर एक्सप्रेशंस और शेल पैटर्न में समान रूप से काम करते हों, वे आम तौर पर बहुत अधिक नहीं होते हैं । ( caseऔर [[ string == pattern ]]पैटर्न मैच [[ string =~ regex ]]का उपयोग करता है , रेगेक्स का उपयोग करता है।)

नियमित अभिव्यक्तियाँ भी शेल-विशिष्ट नहीं हैं, वे जैसे awkऔर sedभी उपयोग किए जाते हैं , और उदाहरण के लिए लिनक्स मैन पेज में वर्णित हैंregex(7)

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