Parece que a nova versão do OSX não oferece mais suporte grep -P
e, como tal, fez com que alguns dos meus scripts parassem de funcionar.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Eu preciso capturar o grep para uma variável e preciso usar as asserções de largura zero, bem como \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Quaisquer alternativas seriam muito apreciadas.
-P
? O meu tem.grep
realmente mudou degrep (GNU grep) 2.5.1
10,7 paragrep (BSD grep) 2.5.1-FreeBSD
10,8. Acho que foi por causa da GPL. O FreeBSDgrep
também é baseado no GNUgrep
e ambas as versõesgrep
são de 2002.--label
e-u
/--unix-byte-offets
também foram removidos no 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, E-p
foram adicionados em 10,8.-Z
mudou de--null
para--decompress
.grep
que vem com o OS X é de 2002, e wiki.freebsd.org/BSDgrep ainda diz que "o único item TODO está melhorando o desempenho", então sim.time grep aa /usr/share/dict/words>/dev/null
leva cerca de 0,09 segundos com o grep do OS X e cerca de 0,01 segundos com um novo grep GNU em execuções repetidas no meu iMac.Respostas:
Se você quiser fazer o mínimo de trabalho, mude
grep -P 'PATTERN' file.txt
para
perl -nle'print if m{PATTERN}' file.txt
e mudar
grep -o -P 'PATTERN' file.txt
para
perl -nle'print $& while m{PATTERN}g' file.txt
Então você obtém:
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`
Em seu caso específico, você pode obter um código mais simples com trabalho extra.
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt` var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
fonte
| tail -1
ao final do pipeline.grep
sempre retorna todas as linhas correspondentes (a menos que você use uma das opções onde não imprime nenhuma). De qualquer forma,if (/.../) { print $1; last; }
fará com que ele imprima apenas a primeira correspondência.say $_->textContent for $doc->findnodes('//loc');
)Se seus scripts são apenas para seu uso, você pode instalar
grep
a partir dehomebrew-core
usarbrew
:brew install grep
Então está disponível como
ggrep
(GNUgrep
). ele não substitui o sistemagrep
(você precisa colocar o grep instalado antes do do sistema noPATH
).A versão instalada por
brew
inclui a-P
opção, então você não precisa alterar seus scripts.Se precisar usar esses comandos com seus nomes normais, você pode adicionar um diretório "gnubin" ao seu PATH do bashrc como:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
Você pode exportar esta linha em seu ~ / .bashrc ou ~ / .zshrc para mantê-la para novas sessões.
Veja aqui uma discussão sobre os prós e contras da
--with-default-names
opção antiga e sua (recente) remoção.fonte
which grep
? Deve ser/usr/local/bin/grep
. É um pouco malvado votar contra ele antes de verificar cuidadosamente se há um problema!/usr/local/bin
à frente de seu PATH. É suposto que Brew tenha feito isso, acredito? Você usou--default-names
? De qualquer forma, fico feliz que funcione (: Não tenho certeza sobre como hackear, mas acho que o sistema de pontos é uma das razões pelas quais este site é um recurso tão bom.--with-default-names
é adicionaralias grep='ggrep'
ao seu perfil do bash e permitir que os brew dupes mantenham seus prefixos--with-default-names
é removido da mistura. Tivebrew install grep
que obter o ggrep e fazer o que @rymo diz e fazalias grep='ggrep'
.Instale o ack e use-o em seu lugar. Ack é um substituto do grep escrito em Perl. Ele tem suporte total para expressões regulares Perl.
fonte
ack
é projetado para ser independente; você não precisa realmente instalá-lo. Se você puder salvar um arquivo, marcá-lo como executável e atualizá-PATH
lo, se necessário, você está pronto para prosseguir.ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
significa a mesma coisa, mas você não precisa do-P
com ack)OS X tende a fornecer ferramentas BSD em vez de ferramentas GNU. Ele não vêm com
egrep
entanto, , o que provavelmente é tudo que você precisa para realizar pesquisas regex.exemplo:
egrep 'fo+b?r' foobarbaz.txt
Um snippet da página de manual do OSX grep:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
fonte
grep -E
em vez degrep -P
era exatamente o que eu precisava.use perl;
perl -ne 'print if /regex/' files ...
Se você precisar de mais
grep
opções (vejo que você gostaria-o
pelo menos), existem váriaspgrep
implementações flutuando pela rede, muitas delas em Perl.Se "quase Perl" for bom o suficiente, o PCRE vem com
pcregrep
.fonte
Há uma outra alternativa:
pcregrep
.Pcregrep é um grep com expressões regulares compatíveis com Perl. Ele tem exatamente o mesmo uso que
grep -P
. Portanto, será compatível com seus scripts.Pode ser instalado com homebrew:
brew install pcre
fonte
Error: No available formula for pcregrep
Que tal usar a opção '-E'? Ele funciona muito bem para mim, por exemplo, se eu quiser verificar se há uma
php_zip
,php_xml
,php_gd2
extensão de php -m uso I:php -m | grep -E '(zip|xml|gd2)'
fonte
Equivalente à resposta aceita, mas sem a exigência da chave -P, que não estava presente nas duas máquinas que eu tinha disponível.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
fonte
Este funcionou para mim:
awk -F":" '/PATTERN/' file.txt
fonte
Outra solução Perl para -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
fonte
use o regex perl one-liner passando a saída find com um pipe. Usei lookbehind (obter links src em html) e lookahead para " e passei a saída de curl (html) para ele.
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&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 'elasticsearch-2.0'" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged 'elasticsearch-dsl'" 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 'sharding'" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged 'master'" 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 'linux'" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged 'camera'" 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 'firebase'" 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 'firebase-authentication'" 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 'ios'" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged 'in-app-purchase'" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged 'piracy-protection'" 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 'unity3d'" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged 'vr'" 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
fonte