2009-09-24 21 views
17

में एक स्ट्रिंग की जगहों को जांचने के लिए कैसे जांचें कि एक स्ट्रिंग "ए बी" सी 'डी "की तरह हो सकती है, मैं कैसे जांच सकता हूं कि स्ट्रिंग में मौजूद एकल/डबल कोट और स्थान है?बैश खोल

+0

आप ऐसा क्यों करना चाहते हैं? यदि आप कोशिश कर रहे हैं, तो कहें, "अमान्य" फ़ाइल नाम की जांच करें, आप रिक्त स्थान या उद्धरण के साथ फ़ाइल नामों का समर्थन करने के लिए स्क्रिप्ट को ठीक कर सकते हैं। उदाहरण के लिए। –

+0

क्या आप कह रहे हैं कि आप यह जानना चाहते हैं: ए) एक स्थान के चारों ओर एक सिंगल/डबल कोट बी है) एक स्पेस के साथ एक सिंगल/डबल कोट सी) कुछ उससे अलग है? – ezpz

+0

बस यह जांचने के लिए कि क्या किसी स्ट्रिंग में कोई एकल उद्धरण है और यदि इसमें कोई स्थान – derrdji

उत्तर

20
case "$var" in 
    *\ *) 
      echo "match" 
      ;; 
     *) 
      echo "no match" 
      ;; 
esac 
+1

है, तो मैं नाइटपिक कर रहा हूं, लेकिन आपको $ var उद्धृत करने की आवश्यकता नहीं है। – Idelic

+0

@Idelic, क्या होगा अगर $ var अनसेट था? – Will

+0

उद्धरण के बिना यह बिल्कुल ठीक है, "कोई मिलान नहीं" प्रिंट करेगा। – Idelic

1

कैसे के लिए इसी तरह एक दृष्टिकोण के बारे में:

$ A="some string"; echo $A | grep \ | wc -l 
1 
$ A="somestring"; echo $A | grep \ | wc -l 
0 

?

6
string="a b '' c '' d" 
if [ "$string" == "${string//[\' ]/}" ] 
then 
    echo did not contain space or single quote 
else 
    echo did contain space or single quote 
fi 
4

यह करने के लिए पोर्टेबल रास्ता grep साथ है:

S="a b '' c '' d" 
if echo $S | grep -E '[ "]' >/dev/null 
then 
    echo "It's a match" 
fi 

... थोड़ा बदसूरत, लेकिन हर जगह कार्य करने की गारंटी।

+1

grep में '-q' विकल्प के साथ,'>/dev/null' की आवश्यकता नहीं है। थोड़ा अच्छा – Ray

21

आप बैश में रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

string="a b '' c '' d" 
if [[ "$string" =~ \ |\' ]] # slightly more readable: if [[ "$string" =~ (|\') ]] 
then 
    echo "Matches" 
else 
    echo "No matches" 
fi 

संपादित करें:

ऊपर स्पष्ट कारणों के लिए, यह एक चर में regex डाल करने के लिए बेहतर है:

pattern=" |'" 
if [[ $string =~ $pattern ]] 

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

+0

मेरे लिए सबसे साफ एक आईएमओ, मैंने टैब भी जोड़ा लेकिन थोड़ा फंकी दिखता है क्योंकि मुझे वहां डॉलर-कोट को फेंकना था 'पैटर्न = "|' '$' | \ t'' - क्या कोई क्लीनर तरीका है? – nhed

+1

@nhed: एकल वर्णों के मामले में, आप पाइप वर्ण विकल्प के बजाय एक वर्ण पैटर्न का उपयोग कर सकते हैं। यह थोड़ा कम बदसूरत हो सकता है: 'pattern = $ '[\' \ t] ''। आप एक चर का उपयोग भी कर सकते हैं: 'tab = $ '\ t'; पैटर्न = "| '| $ टैब" 'या एक शाब्दिक टैब (जो पठनीयता के लिए अच्छा नहीं है) इसे Ctrl-V-Tab का उपयोग करके टाइप करके। –

1
function foo() { 
    echo "String: $*" 
    SPACES=$(($#-1)) 
    echo "Spaces: $SPACES" 
    QUOTES=0 
    for i in $*; do 
     if [ "$i" == "'" ]; then 
      QUOTES=$((QUOTES+1)) 
     fi 
    done 
    echo "Quotes: $QUOTES" 
    echo 
} 

S="string with spaces" 
foo $S 
S="single' 'quotes" 
foo $S 
S="single '' quotes" 
foo $S 
S="single ' ' quotes" 
foo $S 

पैदावार:

String: string with spaces 
Spaces: 2 
Quotes: 0 

String: single' 'quotes 
Spaces: 1 
Quotes: 0 

String: single '' quotes 
Spaces: 2 
Quotes: 0 

String: single ' ' quotes 
Spaces: 3 
Quotes: 2 
7
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces" 
+1

ध्यान दें कि यह उन लोगों के लिए टैब या न्यूलाइन का पता नहीं लगाता है, जो –

0

मुझे आश्चर्य है कि क्यों कोई भी उल्लेख किया [: अंतरिक्ष:] की स्थापना की। आमतौर पर न केवल अंतरिक्ष चरित्र का पता लगाने में रुचि रखते हैं। मुझे अक्सर किसी भी सफेद स्थान का पता लगाने की आवश्यकता होती है, उदा। टैब। "Grep" उदाहरण इस तरह दिखेगा:

$ echo " " | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has Whitespace 
$ echo "a" | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has no Whitespace 
+0

उत्सुक हैं, इस समाधान में रुचि रखने वालों के लिए, मेरा 'grep' मुझे सूचित करता है कि' वर्ण वर्ग वाक्यविन्यास [[: space:]] है, [नहीं: ] '। अन्यथा, उत्कृष्ट समाधान! – jdferreira

+0

चूंकि प्रश्न "बैश" टैग किया गया है, इसलिए किसी स्ट्रिंग का परीक्षण करने के लिए किसी अन्य प्रक्रिया को शुरू करने की आवश्यकता नहीं है: * [[: space:]] * में "केस" $ स्ट्रिंग "*)" मिलान "गूंज ;; esac' –

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