/ / grep- बैक संदर्भ के चारों ओर शब्द सीमाएँ क्यों होनी चाहिए? - मार, grep, backreference, शब्द-सीमा

grep- बैक रेफरेंस के चारों ओर शब्द सीमाएँ क्यों होनी चाहिए? - बैश, grep, backreference, शब्द-सीमा

मैं बस उत्सुक हूं कि क्यों 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

यदि कोई शब्द एक पंक्ति में एक से अधिक बार मौजूद है, तो उसे प्रिंट करें।