grep -P अब काम नहीं करता। मैं अपनी खोजों को कैसे लिख सकता हूं?


98

ऐसा लगता है कि OSX का नया संस्करण अब समर्थन नहीं करता है grep -Pऔर इस तरह से मेरी कुछ लिपियों ने काम करना बंद कर दिया है।

var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`

मुझे एक चर के लिए grep पर कब्जा करने की आवश्यकता है और मुझे शून्य चौड़ाई के सिद्धांतों का उपयोग करने की आवश्यकता है, साथ ही साथ \K

var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`

किसी भी विकल्प की बहुत सराहना की जाएगी।


8
कैसे gnu grep स्थापित करने के बारे में?
केंट

क्या आपको यकीन है कि यह है -P? मेरा है।
केविन

4
@ केविन इसे 10.8 में हटा दिया गया था।
LRI

8
@ AdrianFrühwirth OS X grepवास्तव grep (GNU grep) 2.5.1में 10.7 से बदलकर grep (BSD grep) 2.5.1-FreeBSD10.8 हो गया है। मुझे लगता है कि यह जीपीएल के कारण था। FreeBSD grepभी जीएनयू पर आधारित है grepऔर के दोनों संस्करणों grep2002 से कर रहे हैं --labelऔर -u/ --unix-byte-offetsभी 10.8 में हटा दिया गया। -z/ --decompress, -J/ --bz2decompress, --exclude-dir, --include-dir, -S, -O, और -p10.8 में जोड़ा गया था। -Zसे बदल दिया --nullहै --decompress
०१

3
FreeBSD grepजो OS X के साथ आता है वह 2002 से है, और wiki.freebsd.org/BSDgrep अभी भी कहता है कि "एकमात्र TODO आइटम प्रदर्शन में सुधार कर रहा है", इसलिए हाँ। time grep aa /usr/share/dict/words>/dev/nullOS X के grep के साथ 0.09 सेकंड और मेरे iMac पर बार-बार चलने वाले नए GNU grep के साथ लगभग 0.01 सेकंड का समय लगता है।
लरी

जवाबों:


68

यदि आप कम से कम काम करना चाहते हैं, तो बदलें

grep -P 'PATTERN' file.txt

सेवा

perl -nle'print if m{PATTERN}' file.txt

और बदल जाते हैं

grep -o -P 'PATTERN' file.txt

सेवा

perl -nle'print $& while m{PATTERN}g' file.txt

तो आप प्राप्त करें:

var1=`perl -nle'print $& while m{(?<=<st:italic>).*(?=</italic>)}g' file.txt`
var2=`perl -nle'print $& while m{(property:)\K.*\d+(?=end)}g' file.txt`

अपने विशिष्ट मामले में, आप अतिरिक्त काम के साथ सरल कोड प्राप्त कर सकते हैं।

var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`

1
यह बहुत अच्छा काम करता है, लेकिन यह सभी मैचों को वापस लौटाता है, जहां मैंने जिस grep का उपयोग किया था वह पहला मैच लौटाया। सिर्फ पहले मैच में वापसी करने के बारे में कोई विचार?
कुग्युष

1
@ironintention: | tail -1पाइपलाइन के अंत में जोड़ें ।
पीटर

grepहमेशा सभी मिलान लाइनों को लौटाता है (जब तक कि आप उन विकल्पों में से एक का उपयोग नहीं करते हैं जहां यह बिल्कुल भी प्रिंट नहीं करता है)। वैसे भी, if (/.../) { print $1; last; }इसका कारण केवल पहले मैच को प्रिंट करना होगा।
इकेगामी

मैंने इसका उपयोग एक साइटमैप के उरोजों को बाहर निकालने के लिए किया - धन्यवाद दोस्त, इसे आपकी पोस्ट के बिना नहीं बनाया होगा! perl -nle'print $ 1 अगर m {<loc> (। *) </ loc>} 'sitemap.xml
क्रिश्चियन

2
@ क्रिसियन, इसे एक्सएम :: LibXML जैसे एक उचित XML पार्सर के साथ करने के लिए केवल 3 लाइनें लगेंगी। (कुंजी पंक्ति: say $_->textContent for $doc->findnodes('//loc');)
Ikegami

92

अपनी स्क्रिप्ट केवल अपने उपयोग के लिए हैं, तो आप स्थापित कर सकते हैं grepसे homebrew-coreउपयोग करते हुए brew:

brew install grep 

फिर यह ggrep(GNU grep) के रूप में उपलब्ध है । यह सिस्टम को प्रतिस्थापित नहीं करता है grep(आपको सिस्टम पर एक से पहले स्थापित grep लगाने की आवश्यकता है PATH)।

द्वारा स्थापित संस्करण brewमें -Pविकल्प शामिल है , इसलिए आपको अपनी स्क्रिप्ट बदलने की आवश्यकता नहीं है।

यदि आपको इन आदेशों को उनके सामान्य नामों के साथ उपयोग करने की आवश्यकता है, तो आप अपने bashrc से अपने PATH में "gnubin" निर्देशिका जोड़ सकते हैं:

PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

आप इस लाइन को अपने ~ / .bashrc या ~ / .zshrc पर नए सत्रों के लिए रखने के लिए निर्यात कर सकते हैं।

कृपया पुराने विकल्प के समर्थक और विपक्ष की चर्चा के लिए यहां देखें --with-default-namesऔर इसे हटा दिया गया है।


3
@pepper क्या काम नहीं किया? संभवतः रास्ता ठीक से सेट नहीं किया गया है - इसका आउटपुट क्या है which grep? होना चाहिए /usr/local/bin/grep। इससे पहले कि आप ध्यान से जाँच करें कि कोई समस्या है!
ड्रेविको

2
शायद /usr/local/binअपने पेट के सामने जोड़ने के लिए बेहतर है । काढ़ा माना जाता है कि मुझे विश्वास है? क्या आपने उपयोग किया --default-names? वैसे भी, खुशी से यह काम करता है: (इसके चारों ओर हैकिंग के बारे में निश्चित नहीं है, लेकिन मुझे लगता है कि बिंदु प्रणाली एक कारण है कि यह साइट इतना अच्छा संसाधन है।
drevicko

1
हां मैंने इस्तेमाल किया था --default-names और brew। निश्चित नहीं है कि आपके रास्ते के सामने / usr / लोकल / बिन लगाना उर्फ ​​की तुलना में बेहतर है, बस एक विकल्प
काली मिर्च

10
अपने बैश प्रोफाइल में --with-default-namesजोड़ने के alias grep='ggrep'लिए एक विकल्प है और शराब बनाने के लिए
डुबो

4
--with-default-namesकाढ़ा से निकाल दिया जाता है। मुझे brew install grepgrerep प्राप्त करना था और फिर जैसा कि @rymo कहते हैं और करते हैं alias grep='ggrep'
हेंग

12

एसीसी स्थापित करें और इसके बजाय इसका उपयोग करें । एक पर्ल में एक grep रिप्लेसमेंट है। इसमें पर्ल रेगुलर एक्सप्रेशंस के लिए पूरा सपोर्ट है।


मैं इसे देखना चाहता हूं, लेकिन यह काम कंप्यूटरों के लिए है इसलिए हम कुछ भी स्थापित नहीं कर सकते हैं
kugyousha

@ironintention: यदि आप पर्ल मॉड्यूल स्थापित कर सकते हैं, तो आप अच्छे हैं। यहां तक ​​कि अगर आप स्थानीय पर्ल स्थापना में नहीं जोड़ सकते हैं तो आप हमेशा स्थानीय :: lib का उपयोग कर सकते हैं।
माइकल कार्मन

ackस्व-निहित होने के लिए डिज़ाइन किया गया है; आपको वास्तव में इसे स्थापित करने की आवश्यकता नहीं है। यदि आप किसी फ़ाइल को सहेज सकते हैं, तो उसे एक्सेप्टेबल के रूप में चिह्नित कर सकते हैं, और PATHयदि आवश्यक हो तो अपडेट कर सकते हैं, तो आप जाने के लिए अच्छा है।
त्रिकाल

क्या आप ऊपर के
बदले

@ फुलडेंट: यह लगभग समान है: ack -o '(property:)\K.*\d+(?=end)' file.txt( -oएक ही चीज़ का मतलब है, लेकिन आपको ऐक के -Pसाथ की आवश्यकता नहीं है )
माइकल कार्मन

11

OS X GNU टूल के बजाय BSD प्रदान करता है। यह है के साथ आते हैंegrep फिर भी, जो शायद आप सभी की regex खोज करने के लिए की जरूरत है।

उदाहरण: egrep 'fo+b?r' foobarbaz.txt

OSX grep मैन पेज से एक स्निपेट:

grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).


5
उदाहरण के लिए प्रत्यक्ष आह्वान को पदावनत किया जाता है। वही क्षमता grep -E के रूप में भी उपलब्ध है। यह ... पर्ल की एक दुखद छाया है, लुकअर्स असेसरों की कमी है, ज्यादातर बैकस्लैश बच जाते हैं, विकल्प, सशर्त, आदि :( पावर उपयोगकर्ता इसे नफरत करेंगे, लेकिन यह कम से कम काम करता है।
डेवी मॉर्गन

1
धन्यवाद। grep -Eइसके बजाय grep -Pमुझे वही चाहिए था जो मुझे चाहिए था।
13

6

use perl;

perl -ne 'print if /regex/' files ...

यदि आपको अधिक grepविकल्पों की आवश्यकता है (मुझे लगता है कि आप -oकम से कम चाहेंगे ) विभिन्न हैंpgrep नेट के आसपास कार्यान्वयन चल , उनमें से कई पर्ल में हैं।

यदि "लगभग पर्ल" काफी अच्छा है, तो पीसीआरई जहाजों के साथ pcregrep


5

एक और विकल्प है pcregrep:।

Pcregrep पर्ल-संगत रेगुलर एक्सप्रेशन वाला ग्रीप है। इसका ठीक वैसा ही उपयोग है जैसा कि होता है grep -P। तो यह आपकी स्क्रिप्ट के अनुकूल होगा।

यह homebrew के साथ स्थापित किया जा सकता है:

brew install pcre


Error: No available formula for pcregrep
बजे एरॉन ब्रेजर

GaborMarton, मैंने @Martin की सही टिप्पणी को शामिल करने के लिए आपके उत्तर को संपादित किया, और न्यूनतम परिवर्तनों को प्राप्त करने के लिए प्रारूपण को थोड़ा आगे बढ़ाना पड़ा।
डैनियल बेयर्ड

3

'-E' विकल्प का उपयोग कैसे करें? यह मेरे लिए ठीक काम करता है, उदाहरण के लिए, अगर मैं एक के लिए जाँच करना चाहते हैं php_zip, php_xml, php_gd2से विस्तार php -m मैं उपयोग:

php -m | grep -E '(zip|xml|gd2)'

1
यह काम। मैक FreeBSD grep और Linux का उपयोग करता है GNU grep का उपयोग करता है ... इसलिए इस फिक्स ने मेरे
macOS

2

स्वीकृत उत्तर के बराबर, लेकिन -पी स्विच की आवश्यकता के बिना, जो मेरे पास उपलब्ध दोनों मशीनों पर मौजूद नहीं था।

find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'

2

यह एक मेरे लिए काम किया:

    awk  -F":" '/PATTERN/' file.txt


0

पाइप के साथ खोज आउटपुट पास करके पर्ल वन-लाइनर रेगेक्स का उपयोग करें। मैंने लुकबाइंड का उपयोग किया ( html में src लिंक प्राप्त करें ) और लुकहेड के लिए " और इसके लिए कर्ल (html) का आउटपुट पास किया।

bash-3.2# curl stackoverflow.com | perl -0777 -ne '$a=1;while(m/(?<=src\=\")(.*)(?=\")/g){print "Match #".$a." "."$&\n";$a+=1;}'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  239k  100  239k    0     0  1911k      0 --:--:-- --:--:-- --:--:-- 1919k
Match #1 //ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
Match #2 //cdn.sstatic.net/Js/stub.en.js?v=fb6157e02696
Match #3 https://ssum-sec.casalemedia.com/usermatch?s=183712&amp;cb=https%3A%2F%2Fengine.adzerk.net%2Fudb%2F22%2Fsync%2Fi.gif%3FpartnerId%3D1%26userId%3D
Match #4 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/elasticsearch-2.0" class="post-tag" title="show questions tagged &#39;elasticsearch-2.0&#39;" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged &#39;elasticsearch-dsl&#39;" rel="tag
Match #5 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/sharding" class="post-tag" title="show questions tagged &#39;sharding&#39;" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged &#39;master&#39;" rel="tag
Match #6 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/linux" class="post-tag" title="show questions tagged &#39;linux&#39;" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged &#39;camera&#39;" rel="tag
Match #7 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/firebase" class="post-tag" title="show questions tagged &#39;firebase&#39;" rel="tag"><img src="//i.stack.imgur.com/5d55j.png" height="16" width="18" alt="" class="sponsor-tag-img">firebase</a> <a href="/questions/tagged/firebase-authentication" class="post-tag" title="show questions tagged &#39;firebase-authentication&#39;" rel="tag
Match #8 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/ios" class="post-tag" title="show questions tagged &#39;ios&#39;" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged &#39;in-app-purchase&#39;" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged &#39;piracy-protection&#39;" rel="tag
Match #9 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/unity3d" class="post-tag" title="show questions tagged &#39;unity3d&#39;" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged &#39;vr&#39;" rel="tag
Match #10 http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif" alt="" class="dno
bash-3.2# date
Mon Oct 24 20:57:11 EDT 2016
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.