2011-12-14 13 views
54

grep दोनों --ignore-case और --only-match विकल्पों का उपयोग करते समय विफल रहता है। उदाहरण:grep --ignore-case --only

$ echo "abc" | grep -io abc 
abc 
$ echo "ABC" | grep -io abc 
$ 

लेकिन

$ echo "abc" | grep -i abc 
abc 
$ echo "ABC" | grep -i abc 
ABC 

आदमी पेज के अनुसार:

-o, --only-matching 
      Show only the part of a matching line that matches PATTERN. 
    -i, --ignore-case 
      Ignore case distinctions in both the PATTERN and the input files. 

यह ग्रेप की एक बग है या मैं मानचित्र पृष्ठ नहीं मिला?

मैं उपयोग कर रहा हूँ मैक ओएस एक्स 10.6.8 और

$ grep --version 
grep (GNU grep) 2.5.1 

इस लिंक मिल गया: http://lists.gnu.org/archive/html/bug-gnu-utils/2003-11/msg00040.html

बेशक यह grep -o [aA][bB][cC] तरह तरीके का उपयोग करना संभव है, लेकिन यह एक होना प्रतीत नहीं होता है अच्छा विकल्प

उत्तर

39

यह प्रारंभिक 2.5.1 पर एक knownbug है, और 2007 की शुरुआत में तय किया गया है (Redhat 2.5.1-5) बग रिपोर्ट के अनुसार। दुर्भाग्यवश ऐप्पल अभी भी Mac OS X 10.7.2 पर 2.5.1 का उपयोग कर रहा है।

आप Homebrew (3.0) या MacPorts (2.26) या fink (3.0-1) के माध्यम से एक नया संस्करण प्राप्त कर सकते हैं।


संपादित करें: जाहिर है यह ओएस एक्स 10.11 (या शायद पहले) पर निर्धारित किया गया है, भले ही ग्रेप संस्करण सूचना अब भी है 2.5.1।

+0

केनी, धन्यवाद! आप जो कह रहे हैं वह समझ में आता है, अपडेट करने का प्रयास करेगा। – schatten

5

यह grep के आपके संस्करण में एक समस्या होनी चाहिए।

आपका परीक्षण मामलों मेरी मशीन पर सही ढंग से यहां काम कर रहे हैं:

$ echo "abc" | grep -io abc 
abc 
$ echo "ABC" | grep -io abc 
ABC 

और मेरे संस्करण है:

$ grep --version 
grep (GNU grep) 2.10 
+0

2.6.3 कार्यों में भी कुछ गूंज रहे हैं। – FakeRainBrigand

+0

Red Hat Enterprise Linux 5 पर 2.5.1 पर मेरे लिए काम करता है। –

+1

ऐसा लगता है कि मेरे पास Red Hat 2.5.1-55 स्थापित है, इसलिए यह बग फिक्स के बाद है @ KennyTM रिपोर्ट। –

0

मैं, सुझाव देंगे -i मतलब है कि यह मैच "एबीसी" करता है लेकिन अंतर आउटपुट में है। -i इनपुट में हेरफेर नहीं करता है, इसलिए यह "एबीसी" को "एबीसी" में नहीं बदलेगा क्योंकि आपने पैटर्न के रूप में "abc" निर्दिष्ट किया है। -o कहता है कि यह केवल आउटपुट का हिस्सा दिखाता है जो निर्दिष्ट पैटर्न से मेल खाता है, यह इनपुट मिलान के बारे में नहीं कहता है।

echo "ABC" | grep -i abc के उत्पादन ABC है, -o तो कुछ भी नहीं पता चलता उत्पादन मिलान "abc" पता चलता है:

Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o abc 
Naos:~ mattlacey$ echo "ABC" | grep -i abc | grep -o ABC 
ABC 
2

यदि आपका grep -i काम नहीं करता है तो अपनी फ़ाइल के आउटपुट को कम मामले में बदलने के लिए tr कमांड का उपयोग करने का प्रयास करें और फिर जो भी आप ढूंढ रहे हैं उसके साथ मानक grep में पाइप करें। (यह जटिल लगता है लेकिन वास्तविक आदेश जो मैंने आपके लिए प्रदान किया है वह नहीं है!)।

ध्यान दें कि tr कमांड आपकी मूल फ़ाइल की सामग्री को नहीं बदलेगा, यह इसे grep में फ़ीड करने से ठीक पहले इसे परिवर्तित करता है।

1.here कैसे आप अपने मामले में

tr '[:upper:]' '[:lower:]' <your_file.txt|grep what_ever_you_are_searching_in_lower_case 

2.or एक फ़ाइल पर यह कर सकते हैं अगर आप सिर्फ

echo "ABC"|tr '[:upper:]' '[:lower:]' | grep abc 
+0

यह सामग्री को नहीं बदलता है, लेकिन यह पाइप स्ट्रीम को बदलता है, इसलिए आपको फ़ाइल की मूल मिलान सामग्री नहीं मिल जाएगी। – schatten