grep -P não funciona mais como posso rewrite minhas pesquisas

Parece que a nova versão do OSX não suporta mais o grep -P e, como tal, alguns de meus scripts param de funcionar.

var1=`grep -o -P '(?<=).*(?=)' file.txt` 

Eu preciso capturar o grep para uma variável e eu 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.

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 $& if m{PATTERN}' file.txt 

Então você tem:

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

No seu caso específico, você pode conseguir um código mais simples com trabalho extra.

 var1=`perl -nle 'print $1 if m{(.*)}' file.txt` var2=`perl -nle 'print $1 if /property:(.*\d+)end/' file.txt` 

Se seus scripts são apenas para seu uso, você pode instalar o grep do homebrew-core usando brew :

 brew install grep --with-default-names 

Quando você especifica --with-default-names , ele substitui o system grep (na verdade, coloca o grep instalado antes do sistema um no PATH ).

A versão instalada pelo brew inclui a opção -P , para que você não precise alterar seus scripts.

Se você instalar sem --with-default-names , então ele estará disponível como ggrep (GNU grep ).

Instale o ack e use-o. Ack é uma substituição do grep escrita em Perl. Tem suporte total para expressões regulares Perl.

O OS X tende a fornecer ferramentas BSD em vez de GNU. Ele vem com o egrep , que provavelmente é tudo o que você precisa para realizar pesquisas de regex.

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

Um trecho da página do manual do OSX grep:

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

use perl;

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

Se você precisar de mais opções grep (eu vejo que você gostaria de -o pelo menos), existem várias implementações pgrep flutuando na rede, muitas delas em Perl.

Se “quase Perl” for bom o suficiente, o PCRE será enviado com o pcregrep .

Existe outra alternativa: pcregrep .

Pcregrep é um grep com expressões regulares compatíveis com Perl. Tem exatamente o mesmo uso que o grep -P . Por isso, será compatível com seus scripts.

Pode ser instalado com homebrew:

brew install pcre

Que tal usar a opção ‘-E’? Funciona bem para mim, por exemplo, se eu quiser verificar uma php_zip , php_xml , php_gd2 do php -m eu uso:

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

Equivalente à resposta aceita, mas sem a exigência da opção -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' {} '+' 

Este trabalhou para mim:

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

Outra solução Perl para -P

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

use o regex one-liner perl passando a saída find com um pipe. Eu usei lookbehind (obtenha src links em html) e olhe 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             
  • Leitura contínua do STDOUT do processo externo em Ruby
  • “~ / Desktop / test.txt: não existe esse arquivo ou diretório”
  • Substituição de variables ​​de ambiente em sed
  • Como executar o script shell Unix a partir do código Java?
  • Usando o curl para fazer upload de dados POST com arquivos
  • Matrizes multidimensionais no Bash
  • Quais são os usos do comando exec nos scripts de shell?