मैं बस उत्सुक हूं कि क्यों grep इस तरह से चीजों से मेल खाता है।
उदाहरण के लिए, मान लें कि मैं ऐसा शब्द खोजने की कोशिश कर रहा हूं जो एक वाक्य में दो बार होता है (और अन्य शब्दों के भागों के रूप में नहीं)। तो मैं निम्नलिखित की तरह लाइनों को खोजने की कोशिश कर रहा हूँ:
hello everybody hello
और निम्नलिखित की तरह नहीं:
hello everybody hellopeople
फिर निम्न grep अभिव्यक्ति क्यों काम करती है:
grep -E "(<.*>).*<1>" file
और निम्नलिखित नहीं:
grep -E "(<.*>).*1" file
मैंने सोचा होगा कि दूसरा होगाकाम क्योंकि शब्द सीमाएं (<और>) दूसरे मैच के लिए कोष्ठक के अंदर हैं, लेकिन यह "टी" नहीं है। यह सिर्फ भ्रामक लगता है कि किसी को पीछे के संदर्भ में शब्द सीमाएं डालनी पड़ती हैं, क्या कोई समझा सकता है कि क्यों grep लाइनों से मेल खाता है। इस तरह, या शायद आगे इस विचार पर विस्तृत?
उत्तर:
उत्तर № 1 के लिए 4शून्य चौड़ाई के दावे / शून्य लंबाई मैच को कैप्चर ग्रुप में कैप्चर नहीं किया जा सकता है। b or < >
शून्य लंबाई मैच हैं। इसे समूह में कैद नहीं किया जा सकता। पीछे / आगे की तरह शून्य चौड़ाई के दावे के समान।
उदाहरण के लिए:
((?<=#)w+(?=#)).*1
स्ट्रिंग से मेल खाएगा
#hello# everybody hellofoo
अनुलेख आप उपयोग करना चाह सकते हैं w+
के बजाय .*
अपनी शब्द सीमा के अंदर।
उत्तर के लिए -2 № 2
आप उपयोग कर सकते हैं awk
इसे इस तरह से हल करने के लिए, अगर आपको कोई अच्छा नहीं मिलता है grep
समाधान.
awk "{for (i=1;i<=NF;i++) if (a[$i]++) print $i;delete a}"
hello
यदि कोई शब्द एक पंक्ति में एक से अधिक बार मौजूद है, तो उसे प्रिंट करें।