2012-10-31 4 views
12

कोड इस तरह है:BASH_REMATCH उद्धृत नियमित अभिव्यक्ति के लिए क्यों काम नहीं करता है?

bash-3.2$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12) 
Copyright (C) 2007 Free Software Foundation, Inc. 
bash-3.2$ /bin/bash test_rematch.bash 
bash-3.2$ 

किसी को भी इस बारे में विचार करता है:

#!/bin/bash 
if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]] 
then 
    echo "The regex matches!" 
    echo $BASH_REMATCH 
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 

जब मैं इसे चलाने के लिए प्रयास करते हैं, यह कुछ भी प्रदर्शित नहीं करता है? धन्यवाद!

उत्तर

35

अपने बैश रेगेक्स में, आपको उद्धरण हटा देना चाहिए। यही कारण है कि यह काम नहीं करता है।

आप अंतरिक्ष है, तो मैं इस तरह से उपयोग करने के लिए सलाह देते हैं: अपने डिबगिंग बयान, echo The regex matches! को

#!/bin/bash 
x='foo bar bletch' 
if [[ $x =~ foo[[:space:]](bar)[[:space:]]bl(.*) ]] 
then 
    echo The regex matches! 
    echo $BASH_REMATCH  
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 
+0

धन्यवाद! लेकिन अगर स्पेसबार उद्धरणों का उपयोग किए बिना स्पेसबार में दिखाई देता है तो मैं क्या करूँ? –

+0

मेरी संपादित पोस्ट –

+0

@Firegun इसके अलावा देखें, तो आप भी एक स्थान के साथ '\' या ' ''' या '" "' (अपने जहर का चयन) (पहले एक नहीं ऊपर अच्छी तरह से दिखाने की थी, यह बैकस्लैश है पीछा प्रतिनिधित्व कर सकते हैं अंतरिक्ष द्वारा) – doubleDown

7

धन्यवाद, आपने गौर किया जाना चाहिए वहाँ BASH_REMATCH साथ कोई समस्या नहीं है, के बाद से अगर बयान false मूल्यांकन करता है।

बैश में, =~ के साथ उपयोग किए जाने वाले नियमित अभिव्यक्तियां अनजान हैं। यदि दाईं ओर की स्ट्रिंग उद्धृत की जाती है, तो इसे स्ट्रिंग अक्षर के रूप में माना जाता है।

यदि आप अपने रेगेक्स में सफेद जगहों को शामिल करना चाहते हैं, तो उपयुक्त चरित्र कक्षाओं का उपयोग करें, या यदि आप एक स्थान चाहते हैं तो अपनी जगह से बचें।

9

तुम भी एक चर को उद्धृत regexp असाइन कर सकते हैं:

#!/bin/bash 

x='foobarbletch' 

foobar_re='foo(bar)bl(.*)' 

if [[ $x =~ $foobar_re ]] ; then 
    echo The regex matches! 
    echo ${BASH_REMATCH[*]} 
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi 

यह न केवल के हवाले से सरल का समर्थन करता है लेकिन regexp एक नाम जो पठनीयता मदद कर सकते हैं देता है।

+0

मैं * प्यार * पठनीयता। – Cometsong

संबंधित मुद्दे