grep -P artık çalışmıyor. Aramalarımı nasıl yeniden yazabilirim?


99

Görünüşe göre OSX'in yeni sürümü artık desteklemiyor grep -Pve bu nedenle bazı komut dosyalarımın çalışmamasına neden oldu.

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

Grep'i bir değişkene yakalamam ve sıfır genişlik iddialarını kullanmam gerek \K

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

Herhangi bir alternatif çok takdir edilecektir.


8
gnu grep'i kurmaya ne dersiniz?
Kent

Olduğundan emin misin -P? Benimkinde var.
Kevin

4
@Kevin 10.8'de kaldırıldı.
Lri

8
@ AdrianFrühwirth OS X oluyor grepaslında değiştirildi grep (GNU grep) 2.5.110.7 yılında grep (BSD grep) 2.5.1-FreeBSD10.8 'de. Sanırım GPL yüzünden oldu. FreeBSD grepayrıca GNU dayanmaktadır grepve her iki versiyonu grep2002 gelmektedir --labelve -u/ --unix-byte-offetsda 10.8 'de çıkarıldı. -z/ --decompress, -J/ --bz2decompress, --exclude-dir, --include-dir, -S, -O, Ve -p10.8 'de ilave edilmiştir. -Zdeğiştirilmiştir --nulliçin --decompress.
LRI

3
grepOS X ile birlikte gelen FreeBSD 2002'den ve wiki.freebsd.org/BSDgrep hala "tek TODO öğesinin performansı artırmak olduğunu" söylüyor, yani evet. time grep aa /usr/share/dict/words>/dev/nulliMac'imde tekrarlanan çalışmalarda OS X'in grepiyle yaklaşık 0,09 saniye ve yeni GNU grepiyle yaklaşık 0,01 saniye sürer.
LRI

Yanıtlar:


68

Minimum miktarda iş yapmak istiyorsanız, değiştirin

grep -P 'PATTERN' file.txt

-e

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

ve değişim

grep -o -P 'PATTERN' file.txt

-e

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

Böylece şunları elde edersiniz:

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`

Özel durumunuzda, fazladan çalışmayla daha basit bir kod elde edebilirsiniz.

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

1
Bu harika çalışıyor, ancak kullandığım grep'in yalnızca ilk maçı döndürdüğü tüm maçları döndürüyor. sadece ilk maçın nasıl geri döneceği hakkında bir fikrin var mı?
kugyousha

1
@ironintention: | tail -1boru hattının sonuna ekleyin .
Peter

grepher zaman tüm eşleşen satırları döndürür (hiçbirini yazdırmadığı seçeneklerden birini kullanmadığınız sürece). Her neyse, if (/.../) { print $1; last; }yalnızca ilk eşleşmeyi yazdırmasına neden olur.
ikegami

Bunu bir site haritasının url'lerini çıkarmak için kullandım - teşekkürler dostum, gönderiniz olmasaydı bunu başaramazdım! perl -nle'print 1 $ if m {<loc> (. *) </loc>} 'sitemap.xml
Christian

2
@Christian, XML :: LibXML gibi uygun bir XML ayrıştırıcısı ile bunu yapmak sadece 3 satır alır. (Anahtar satır: say $_->textContent for $doc->findnodes('//loc');)
Ikegami

93

Senin komut dosyaları sadece kullanımınıza iseniz, yükleyebilirsiniz grepgelen homebrew-corekullanılarak brew:

brew install grep 

O zaman ggrep(GNU grep) olarak mevcuttur . sistemin yerini almaz grep(kurulu grep'i sistemdeki grep'in önüne koymanız gerekir PATH).

Tarafından yüklenen sürüm seçeneği brewiçerir -P, böylece komut dosyalarınızı değiştirmeniz gerekmez.

Bu komutları normal adlarıyla kullanmanız gerekiyorsa, bashrc'nizden PATH'inize bir "gnubin" dizini ekleyebilirsiniz:

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

Bu satırı yeni oturumlarda saklamak için ~ / .bashrc veya ~ / .zshrc dosyanıza aktarabilirsiniz.

Eski seçeneğin artıları ve eksileri hakkında bir tartışma için buraya bakın --with-default-namesve (son zamanlarda) kaldırıldı.


3
@pepper ne işe yaramadı? Muhtemelen yol doğru ayarlanmamıştır - çıktısı which grepnedir? Olmalı /usr/local/bin/grep. Bir sorun olup olmadığını dikkatlice kontrol etmeden önce olumsuz oy kullanmak biraz anlamsızdır!
drevicko

2
PATH'inizin /usr/local/binönüne eklemek muhtemelen daha iyi . Bunu Brew ayarlaması gerektiğini düşünüyorum? Kullandın --default-namesmı Neyse, işe yaradığına sevindim (: Etrafını hacklemek konusunda emin değilim, ama bence bu sitenin bu kadar iyi bir kaynak olmasının nedenlerinden biri puan sistemi.
drevicko

1
evet --varsayılan isimler ve demleme kullandım. Yolunuzun önüne / usr / local / bin koymanın bir takma
pepper

10
alternatifi , bash profilinize --with-default-nameseklemek alias grep='ggrep've brew
dupes'ların öneklerini korumalarına

4
--with-default-namesdemlemeden çıkarılır. Ben zorunda brew install grepggrep almak ve sonra @rymo dediğini yap ve yapılacak alias grep='ggrep'.
Henge

12

Ack'i kurun ve onun yerine kullanın. Ack, Perl ile yazılmış bir grep değişimidir. Perl düzenli ifadeleri için tam desteğe sahiptir.


Bunu kontrol etmek istiyorum ama bu iş bilgisayarları içindir, bu yüzden hiçbir şey yükleyemiyoruz
kugyousha

@ironintention: Perl modüllerini kurabilirseniz, iyisinizdir. Yerel Perl kurulumuna ekleme yapamasanız bile her zaman local :: lib kullanabilirsiniz.
Michael Carman

ackkendi kendine yetecek şekilde tasarlanmıştır; gerçekten yüklemenize gerek yok. Bir dosyayı kaydedebilir, olağanüstü olarak işaretleyebilir ve PATHgerekirse dosyanızı güncelleyebilirseniz, gitmekte fayda var .
üçlü

Yukarıdakilerin yerini alan ack sözdizimini lütfen yapabilir misiniz
William Entriken

@FullDecent: Neredeyse aynı: ack -o '(property:)\K.*\d+(?=end)' file.txt( -oaynı anlama geliyor, ancak -Pack ile ihtiyacınız yok )
Michael Carman

11

OS X, GNU araçları yerine BSD sağlama eğilimindedir. O mu gel egrepsen düzenli ifade arama yapmak için gereken muhtemelen tüm olan ancak.

misal: egrep 'fo+b?r' foobarbaz.txt

OSX grep man sayfasından bir pasaj:

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


5
Egrep olarak doğrudan çağrı kullanımdan kaldırılmıştır. Aynı yetenek grep -E olarak da mevcuttur. Bu, ters eğik çizgi kaçar çoğu, seçenekler, conditionals vb :( Güç kullanıcıları nefret edecek etrafa bakma iddialarını yoksun ... Perl üzücü bir gölge, ama en azından bir iş yapar.
Dewi Morgan

1
Teşekkürler. grep -Eyerine grep -Ptam olarak ihtiyacım olan şeydi.
asmaier

6

use perl;

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

Eğer daha fazla grepseçeneğe ihtiyacınız varsa ( -oen azından isteyeceğinizi düşünüyorum ) pgrep, çoğu Perl'de olmak üzere ağ etrafında yüzen çeşitli uygulamalar vardır .

"Neredeyse Perl" yeterince iyiyse, PCRE ile birlikte gelir pcregrep.


5

Başka bir seçenek daha var: pcregrep.

Pcregrep , Perl uyumlu düzenli ifadeler içeren bir greptir . İle tamamen aynı kullanıma sahiptir grep -P. Böylece senaryolarınızla uyumlu olacaktır.

Homebrew ile kurulabilir:

brew install pcre


Error: No available formula for pcregrep
Aaron Brager

GaborMarton, cevabınızı @Martin'in düzeltme yorumunu içerecek şekilde düzenledim ve minimum değişiklikleri aşmak için biçimlendirmeyi biraz hareket ettirmek zorunda kaldım.
Daniel Baird

3

'-E' seçeneğini kullanmaya ne dersiniz? Ben kontrol etmek istiyorsanız, örneğin, benim için para cezası işleri php_zip, php_xml, php_gd2gelen uzatma php -m I kullanımı:

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

1
bu çalışıyor. Mac FreeBSD grep kullanıyor ve Linux GNU grep kullanıyor ... bu yüzden bu düzeltme macOS
Sierra'mda

2

Kabul edilen cevabın eşdeğeri, ancak her iki makinede de mevcut olmayan -P anahtarına gerek yoktu.

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

2

Bu benim için çalıştı:

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

0

-P için başka bir Perl çözümü

var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)

0

find çıktısını bir boru ile ileterek perl tek satırlık normal ifadesini kullanın. Kullandığım Geriye dönük (get src html bağlantıları) ve lookahead için " ve ona kıvrılma (html) çıktısını geçti.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.