क्या grep केवल उन शब्दों को दिखा सकता है जो खोज पैटर्न से मेल खाते हैं?




words (9)

क्या खोज अभिव्यक्ति से मेल खाने वाली फ़ाइलों से grep आउटपुट "शब्द" बनाने का कोई तरीका है?

अगर मैं कई उदाहरणों में कहूं, "वें" कहूं, तो मैं कर सकता हूं:

grep "th" *

लेकिन आउटपुट कुछ ऐसा होगा (बोल्ड मेरे द्वारा है);

some-text-file : the cat sat on the mat  
some-other-text-file : the quick brown fox  
yet-another-text-file : i hope this explains it thoroughly 

एक ही खोज का उपयोग करके, मैं इसे आउटपुट करना चाहता हूं, यह है:

the
the
the
this
thoroughly

क्या यह grep का उपयोग कर संभव है? या उपकरण के एक और संयोजन का उपयोग कर?


"आइकन-" से शुरू होने वाले सभी शब्दों को खोजने के लिए निम्न आदेश सही काम करता है। मैं यहाँ Ack का उपयोग कर रहा हूं जो grep के समान है लेकिन बेहतर विकल्प और अच्छी स्वरूपण के साथ।

ack -oh --type=html "\w*icon-\w*" | sort | uniq

Grep -o कोशिश करें

grep -oh "\w*th\w*" *

संपादित करें: फिल की टिप्पणी से मेल खाते हैं

दस्तावेज़ों से :

-h, --no-filename
    Suppress the prefixing of file names on output. This is the default
    when there is only  one  file  (or only standard input) to search.
-o, --only-matching
    Print  only  the matched (non-empty) parts of a matching line,
    with each such part on a separate output line.

आप अपने जीआरपी आउटपुट को पर्ल में इस तरह पाइप कर सकते हैं:

grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'

आप रिक्त स्थान को न्यूलाइन में अनुवाद कर सकते हैं और फिर grep, उदाहरण के लिए:

cat * | tr ' ' '\n' | grep th

बस awk , उपकरण की कोई ज़रूरत नहीं है।

# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly

मुझे एक समान समस्या थी, grep / pattern regex और आउटपुट के रूप में "मिलान पैटर्न" पाया गया।

अंत में मैंने egrep का उपयोग किया (grep -e पर एक ही regex या -G मुझे egrep का एक ही परिणाम नहीं दिया) विकल्प के साथ

इसलिए, मुझे लगता है कि ऐसा कुछ हो सकता है (मैं रेगेक्स मास्टर नहीं हूं):

egrep -o "the*|this{1}|thoroughly{1}" filename

यह आपके विचार से कहीं अधिक सरल है। इसे इस्तेमाल करे:

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' filename.txt  ### (Case Insensitive)

कहा पे,

 egrep: Grep will work with extended regular expression.
 w    : Matches only word/words instead of substring.
 o    : Display only matched pattern instead of whole line.
 i    : If u want to ignore case sensitivity.

क्रॉस वितरण सुरक्षित उत्तर (विंडोज़ मिनीजीडब्ल्यू सहित)?

grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"

यदि आप grep के पुराने संस्करणों का उपयोग करते हैं (जैसे 2.4.2) जिसमें -o विकल्प शामिल नहीं है। उपरोक्त का प्रयोग करें। अन्यथा नीचे संस्करण बनाए रखने के लिए सरल का उपयोग करें।

लिनक्स क्रॉस वितरण सुरक्षित जवाब

grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'

संक्षेप में - वह फ़ाइल सामग्री (और इसके फ़ाइल नाम नहीं) के नियमित अभिव्यक्ति मिलान को आउटपुट करता है, बस आप नियमित अभिव्यक्ति को vim / etc में काम करने की अपेक्षा कैसे करेंगे ... फिर आप किस शब्द या नियमित अभिव्यक्ति की खोज करेंगे, है आप पर निर्भर करता है! जब तक आप POSIX पर रहते हैं और पर्ल सिंटैक्स नहीं (नीचे देखें)

Grep के लिए मैनुअल से अधिक

-o      Print each match, but only the match, not the entire line.
-h      Never print filename headers (i.e. filenames) with output lines.
-w      The expression is searched for as a word (as if surrounded by
         `[[:<:]]' and `[[:>:]]';

कारण मूल उत्तर हर किसी के लिए काम नहीं करता है

\w का उपयोग मंच से मंच तक भिन्न होता है, क्योंकि यह एक विस्तारित "perl" वाक्यविन्यास है। ऐसे में, उन grep स्थापना जो POSIX वर्ण वर्गों के साथ काम करने के लिए सीमित है [[:alpha:]] का उपयोग करता है और इसके बराबर नहीं है \wअधिक के लिए नियमित अभिव्यक्ति पर विकिपीडिया पेज देखें

आखिरकार, ऊपर दिए गए पॉज़िक्स उत्तर grep के लिए मंच (मूल होने के बावजूद) अधिक भरोसेमंद होंगे

बिना किसी विकल्प के grep के समर्थन के लिए, पहला grep प्रासंगिक लाइनों को आउटपुट करता है, tr रिक्त स्थान को नई लाइनों में विभाजित करता है, अंतिम grep केवल संबंधित लाइनों के लिए फ़िल्टर करता है।

(पीएस: मैं अब तक के अधिकांश प्लेटफार्मों को जानता हूं, \ w के लिए पैच किया गया होगा .... लेकिन हमेशा ऐसे लोग हैं जो पीछे हटते हैं)

@AdamRosenfield उत्तर से "-o" कामकाज के लिए क्रेडिट


cat *-text-file | grep -Eio "th[a-z]+"