2012-03-03 12 views
7

मैं इस है:उपयोग ग्रेप एक पंक्ति में एक पैटर्न मिलान करने के लिए केवल एक बार

echo 12345 | grep -o '[[:digit:]]\{1,4\}' 

कौन इस देता है:

1234 
5 

मैं समझता हूँ कि क्या हो रहा। 1 सफल मैच के बाद मिलान जारी रखने की कोशिश करने से मैं grep को कैसे रोकूं?

मैं कैसे करूँ केवल

1234 

उत्तर

5

आप समूहीकरण क्या करने की जरूरत: \(...\) घटना की सही संख्या के द्वारा पीछा किया: \{<n>\} काम करने के लिए:

maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' 
1234 

आशा है कि यह मदद करता है। चीयर्स !!

7

आप ग्रेप चाहते मिलान को रोकने के लिए या आप केवल पहले मैच के बारे में परवाह करते हैं क्या मिलता है। आप head इस्तेमाल कर सकते हैं, तो बाद में सच है ...

`grep stuff | head -n 1` 

Grep के बाद यह पहली बार लाइन जो जब सिर के साथ संयुक्त से मेल खाता बंद करने के लिए util तो -m 1 झंडा ग्रेप बताता आधारित एक पंक्ति है में बहुत अच्छी है अभ्यास।

+0

यह काम करता है! लेकिन अगर मैं पाया तो पहले मैच के बाद मैं वास्तव में grep को मिलान से कैसे रोकूं? बस उत्सुक। – abc

+0

-m पहला मैच मिलने के बाद grep को मिलान से नहीं रोकता है। – abc

+0

सबसे पहले मैंने -एम फ्लैग को शामिल करने के लिए अपना उत्तर संपादित किया जो आपके प्रश्न में पहले से ही था, ug। -एम 1 का उपयोग करके खोज को केवल पहली पंक्ति में सीमित कर दिया जाएगा और सिर फ़िल्टर करेगा जो अभ्यास में बहुत अच्छा होना चाहिए। –

2

उपयोग sed बजाय grep:

echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p' 

इस लाइन की शुरुआत में 4 अंक, कुछ भी द्वारा पीछा करने के लिए ऊपर से मेल खाता है, बस अंक रहता है, और उन्हें प्रिंट करता है। -n अन्यथा मुद्रित होने से लाइनों को रोकता है। यदि अंक स्ट्रिंग भी मध्य-रेखा दिखाई दे सकती है, तो आपको थोड़ी अधिक जटिल कमांड की आवश्यकता होती है।

असल में, आदर्श रूप से आप पीसीआर नियमित अभिव्यक्तियों के साथ sed का उपयोग करेंगे क्योंकि आपको वास्तव में एक गैर-लालची मैच की आवश्यकता है। हालांकि, एक उचित सन्निकटन अप करने के लिए, आप का उपयोग कर सकते हैं: (! एक काफी अधिक जटिल समस्या को एक अर्ध-समाधान ... अब हटा दिया)

आप पर अप करने के लिए 4 अंक की पहली स्ट्रिंग चाहते हैं के बाद से लाइन, बस sed का उपयोग किसी भी गैर अंक दूर करने के लिए और उसके बाद अंकों स्ट्रिंग प्रिंट:

echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p' 

इस गैर अंक 1-4 अंक कुछ भी द्वारा पीछा के बाद की एक स्ट्रिंग से मेल खाता है, बस अंक, और प्रिंट रहता है उन्हें।

+0

'sed's s/^ [^ 0-9] * \ ([0-9] \ {1,4 \} \)। */\ 1/p; d'' शायद थोड़ा कम व्यस्त? – potong

0

है - के रूप में अपने उदाहरण में - अपने संख्यात्मक अभिव्यक्ति स्ट्रिंग आप के साथ शुरू कर रहे हैं की शुरुआत में दिखाई देंगे, तो आप सिर्फ एक शुरुआत के-लाइन लंगर ^ जोड़ सकते हैं:

echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 

आप जिस सटीक अंक चाहते हैं उसके आधार पर, एक अंत-ऑफ़-लाइन एंकर $ भी मदद कर सकता है।

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