grep "+" ऑपरेटर काम नहीं करता है


31

यह

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

आउटपुट यह:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

लेकिन यह:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

आउटपुट कुछ नहीं।

क्यूं कर? मैं बस में बदल *गया +। क्या यह समान नहीं है? ऑपरेटर को +बस कम से कम एक मैच और *शून्य या अधिक की आवश्यकता है।

जवाबों:


36

ऐसा इसलिए है क्योंकि grep(बिना किसी तर्क के) केवल मानक नियमित अभिव्यक्तियों के साथ काम करता है। +विस्तारित नियमित अभिव्यक्तियों का हिस्सा है, इसलिए इसका उपयोग करने के लिए, आपको उपयोग करने की आवश्यकता है grep -Eया egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

इसके अलावा, यदि आप विस्तारित नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहते हैं, तो आप ऐसा कर सकते हैं:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

धन्यवाद। अब मैं उस वर्कअराउंड के बारे में हूं, लेकिन मैं सोच रहा था कि "+" काम क्यों नहीं करता है। अब मुझे पता है। एक बार फिर धन्यवाद।
मार्को

11

MiJyns के उत्तर पर विस्तृत करने के लिए, "विशेष वर्ण" जैसे + मानक रीगेक्स में भी काम करते हैं, लेकिन आपको उन्हें बैकस्लैश के साथ भागने की आवश्यकता है। आप कह सकते हैं, डिफ़ॉल्ट अपेक्षाएँ मानक और विस्तारित रेगेक्स के बीच उलट हैं:

मानक रेगेक्स में, अक्षर डिफ़ॉल्ट रूप से शाब्दिक रूप से मेल खाते हैं। उदाहरण के लिए, मेंgrep "ab+" + एक शाब्दिक + है। उदाहरण के लिए रेगेक्स "ab + ab" खोजेगा, लेकिन "abbbb" नहीं। + के "विशेष अर्थ" का उपयोग करने के लिए, आपको इसे से बचने की आवश्यकता है। तो grep "ab\+""abbb" मिलेगा, लेकिन अब "ab + ab" नहीं। क्योंकि अंतिम उदाहरण में, + को क्वांटिफायर "एक या कई" के रूप में व्याख्या की जाती है, उस स्थिति में "एक या कई बी"।

विस्तारित रेगेक्स में यह बिल्कुल अन्य तरह से होता है। यहां, आपको "विशेष वर्ण" से बचने के लिए शाब्दिक रूप से व्यवहार करने की आवश्यकता है। तो grep -E "ab+""एबीबी" पाता है, लेकिन "एबी + एबी" नहीं। यदि आप + से बचते हैं, तो यह शाब्दिक रूप से मेल खाता है। तो grep -E "ab\+""अब + एबी" पाता है, लेकिन "एबीबी" नहीं।


1
क्या एक विरासत गड़बड़ ...;; जैसा जादू और सुपरमिजिकल रीम इन विम। Urgh। पिछड़ी संगतता के लिए भुगतान करने की कीमत ...
रमनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.