2012-02-13 11 views
10

मैं नीचे दिए गए लेकिन कुछ भी स्क्रीन पर छपा है एक नंबर निकालने के लिए प्रयास किया है:अंकों की sed निकालने समूह

echo "This is an example: 65 apples" | sed -n 's/.*\([0-9]*\) apples/\1/p' 

हालांकि, मैं मिलता है '65', अगर दोनों अंक अलग से मिलान किया जाता है के रूप में नीचे दिए गए:

echo "This is an example: 65 apples" | sed -n 's/.*\([0-9][0-9]\) apples/\1/p' 
65 

मैं ऐसे नंबर से कैसे मिलान कर सकता हूं जो मुझे निकालने के लिए किसी संख्या में अंकों की संख्या नहीं पता है 65 के स्थान पर यह 2344 हो सकता है?

उत्तर

14
$ echo "This is an example: 65 apples" | sed -r 's/^[^0-9]*([0-9]+).*/\1/' 
65 
+2

+1, लेकिन सावधान रहना है कि नहीं सभी sed समर्थन -r और इस तरह उपयोग नहीं कर सकते '+ 'संशोधक और माता-पिता से बच जाना चाहिए। –

+1

'[([0-9] *) सेब regex क्यों है]' (http://sprunge.us/feGV) sed में काम नहीं करता है? यह अजगर में बस ठीक काम करता है। –

+0

तो ...^[^ 0-9] * लाइन की शुरुआत में सबकुछ गैर अंकों के अनुरूप है। [0-9] + कम से कम एक अंक या उससे अधिक, सही? – baltoro

1

जो आप देख रहे हैं वह रेगेक्स का लालची व्यवहार है। आपके पहले उदाहरण में, .* सभी अंकों को gobbles। ऐसा कुछ ऐसा करता है:

echo "This is an example: 65144 apples" | sed -n 's/[^0-9]*\([0-9]\+\) apples/\1/p' 
65144 

इस तरह, आप पहले बिट में किसी भी अंक से मेल नहीं खा सकते हैं। कुछ रेगेक्स बोलियों के पास गैर लालची मिलान के लिए पूछने का एक तरीका है, लेकिन मुझे विश्वास नहीं है कि sed में एक है।

3

यह क्योंकि अपने पहले .*लालची है, और अपने [0-9]* 0 या अधिक अंकों की अनुमति देता है है। इसलिए .* जितना हो सके उतने ऊपर (अंक सहित) और [0-9]* कुछ भी मेल नहीं खाता है।

आप कर सकते हैं:

echo "This is an example: 65 apples" | sed -n 's/.*\b\([0-9]\+\) apples/\1/p' 

मैं कहाँ मजबूर [0-9] कम से कम एक अंकों मैच के लिए, और इसलिए पूरी संख्या मिलान किया जाता है भी अंक से पहले एक शब्द सीमा गयी।

हालांकि, यह grep, उपयोग में आसान है, जहां आप सिर्फ संख्या का मिलान:

echo "This is an example: 65 apples" | grep -P -o '[0-9]+(?= +apples)' 

-P का अर्थ है "पर्ल regex" (तो मैं भागने के बारे में '+' चिंता करने की ज़रूरत नहीं है)।

-o का अर्थ है "केवल मैचों को मुद्रित करें"।

(?= +apples) का अर्थ है सेब शब्द के बाद अंकों से मेल खाता है।

+0

मुझे लगता है कि sed गैर लालची 'पहचानकर्ता पहचान नहीं है। [इसे देखें] (http://stackoverflow.com/a/1103177/167814)। –

+0

आह, मैं देखता हूं। खुश होती है। –

+0

पहला उदाहरण –

0
echo "This is an example: 65 apples" | ssed -nR -e 's/.*?\b([0-9]*) apples/\1/p' 

हालांकि आपको इसके लिए काम करने के लिए सुपर-sed की आवश्यकता होगी। -आर perl regexp की अनुमति देता है।

1

एक स्ट्रिंग

echo "1213 test 456 test 789" | grep -P -o "\d+" 

और परिणाम से सभी नंबरों को निकालने के लिए एक आसान तरीका:

1213 
456 
789