grep

2011-02-16 14 views
5

के साथ एक रेगेक्स में अंतिम चरित्र को कैसे पकड़ें मैं आखिरी जगह को पकड़ने की कोशिश कर रहा हूं और grep का उपयोग करके लाइन पर इसका क्या अनुसरण कर रहा हूं।grep

यह मैं पहले अंतरिक्ष हड़पने:

echo "toto tata titi" | grep -o " .*$" 

जावा में मैं गैर लालची ऑपरेटर का इस्तेमाल किया है, लेकिन यह काम करने के लिए प्रतीत नहीं होता:

echo "toto tata titi" | grep -o " .*?$" 

यह

लौट कुछ भी नहीं

अपेक्षित परिणाम titi है।

उत्तर

6

.[^ ] के साथ बदलें, जो अंतरिक्ष के अलावा सबकुछ से मेल खाता है। फिर यह लालची हो सकता है।

echo "toto tata titi" | grep -o " [^ ]*$" 

(आप grep विस्तारित regexes उपयोग करते हैं, या तो egrep या grep -E उपयोग करना चाहते हैं।)

+0

आपका रेगेक्स जो मैं करना चाहता था, धन्यवाद। लेकिन क्या आप जानते हैं कि मेरा काम क्यों नहीं करता है? – JPB

+0

@ जीन-फिलिप: क्योंकि रेगेक्स को विषय स्ट्रिंग पर बाएं से दाएं तक लागू किया जाता है, इसलिए यह पहली जगह पर शुरू होता है, धीरे-धीरे अंत तक फैलता है और इस प्रकार सफल होता है। आगे की स्थिति की कोशिश करने की जरूरत नहीं है। –

+0

@ जीन: '/। *? $ /' मैच पहले अंतरिक्ष पाता है और वहां से मिलान शुरू होता है। यह स्ट्रिंग के अंत तक मिलान करता रहता है और किया जाता है। गैर-लालची केवल तब खेलती है जब दुभाषिया को यह तय करना होता है कि वर्तमान इकाई ('.') की तलाश जारी रखना है या इसके बजाय अगले के साथ मिलान करना है या नहीं। यह _not_ बैकट्रैक करता है जब तक कि यह सबसे छोटा समाधान नहीं मिलता है। – Tim

1

संपादित करें: मैं सिर्फ इस पोस्ट के लिए एक बेहतर जवाब देखा है, लेकिन इस वैसे भी पोस्टिंग, के रूप में यह हो सकता है यदि आप चीजों को प्रतिस्थापित करने की तरह कुछ और जटिल करना चाहते हैं तो सहायक बनें।

:

के रूप में यह करने के लिए एक और तरीका है sed आदेश का उपयोग करें और यह जो आप चाहते हैं कि सिवाय (s कमांड के साथ regex में पहली) स्थानापन्न सब कुछ करते हैं (जो कोष्ठकों द्वारा चर \1 में एकत्र किया जाता है

echo "toto tata titi" | sed -r "s/.*(.*?)$/\1/" 
1
मूल रूप से

, तुम क्या कर रहे अभी पिछले क्षेत्र का पहला वर्ण हो रही है। regex की तुलना में अधिक सुलभ विधि के लिए एक उपकरण है कि खेतों में तार विभाजित कर सकते हैं का उपयोग कर और कर रहा है "सबस्ट्रिंग-इंग"।

$ echo "toto tata titi" | awk '{print substr($NF,0,1)}' 
t 


$ echo "toto tata titi" | ruby -ane 'puts $F[-1][0]' 
t