Parece que la nueva versión de OSX ya no es compatible grep -Py, como tal, ha hecho que algunos de mis scripts dejen de funcionar.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Necesito capturar el grep en una variable y necesito usar las aserciones de ancho cero, así como \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Cualquier alternativa será muy apreciada.

-P? El mío lo tiene.greprealidad cambió degrep (GNU grep) 2.5.110.7 agrep (BSD grep) 2.5.1-FreeBSD10.8. Supongo que fue por GPL. FreeBSDgreptambién está basado en GNUgrepy ambas versiones degrep2002.--labely-u/--unix-byte-offetstambién fueron eliminadas en 10.8.-z/--decompress,-J/--bz2decompress,--exclude-dir,--include-dir,-S,-O, Y-pse añadieron en 10,8.-Zcambiado de--nulla--decompress.grepque viene con OS X es de 2002, y wiki.freebsd.org/BSDgrep todavía dice que "el único elemento de TODO es mejorar el rendimiento", así que sí.time grep aa /usr/share/dict/words>/dev/nulltoma aproximadamente 0.09 segundos con el grep de OS X y aproximadamente 0.01 segundos con un nuevo grep GNU en ejecuciones repetidas en mi iMac.Respuestas:
Si quiere hacer la mínima cantidad de trabajo, cambie
grep -P 'PATTERN' file.txta
perl -nle'print if m{PATTERN}' file.txty cambio
grep -o -P 'PATTERN' file.txta
perl -nle'print $& while m{PATTERN}g' file.txtEntonces obtienes:
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`En su caso específico, puede lograr un código más simple con trabajo adicional.
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt` var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`fuente
| tail -1al final de la canalización.grepsiempre devuelve todas las líneas coincidentes (a menos que use una de las opciones donde no imprime ninguna). De todos modos,if (/.../) { print $1; last; }hará que solo imprima la primera coincidencia.say $_->textContent for $doc->findnodes('//loc');)Si las secuencias de comandos son para un solo uso, se puede instalar
grepdesdehomebrew-coreel uso debrew:brew install grepEntonces está disponible como
ggrep(GNUgrep). no reemplaza el sistemagrep(debe colocar el grep instalado antes que el del sistemaPATH).La versión instalada por
brewincluye la-Popción, por lo que no necesita cambiar sus scripts.Si necesita usar estos comandos con sus nombres normales, puede agregar un directorio "gnubin" a su PATH desde su bashrc como:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"Puede exportar esta línea en su ~ / .bashrc o ~ / .zshrc para conservarla para nuevas sesiones.
Consulte aquí para ver una discusión de los pros y los contras de la
--with-default-namesopción anterior y su eliminación (reciente).fuente
which grep? Debería ser/usr/local/bin/grep. ¡Es un poco malo votar en contra antes de comprobar cuidadosamente que hay un problema!/usr/local/binal frente de su PATH. ¿Se supone que Brew configura eso, creo? ¿Usaste--default-names? De todos modos, me alegro de que funcione (: No estoy seguro de hackearlo, pero creo que el sistema de puntos es una de las razones por las que este sitio es un recurso tan bueno.--with-default-nameses agregarloalias grep='ggrep'a su perfil de bash y dejar que los embaucadores de cerveza mantengan su prefijo--with-default-namesse retira de la preparación. Tenía quebrew install grepconseguir ggrep y luego hacer lo que @rymo dice y hacealias grep='ggrep'.Instale ack y utilícelo en su lugar. Ack es un reemplazo de grep escrito en Perl. Tiene soporte completo para expresiones regulares de Perl.
fuente
ackestá diseñado para ser autónomo; no es necesario que lo instales. Si puede guardar un archivo, marcarlo como ejecutable y actualizarloPATHsi es necesario, ya está listo.ack -o '(property:)\K.*\d+(?=end)' file.txt(-osignifica lo mismo, pero no necesitas el-Pcon ack)OS X tiende a proporcionar BSD en lugar de herramientas GNU. Que no vienen con
egrepsin embargo, que es probablemente todo lo que necesita para llevar a cabo búsquedas de expresiones regulares.ejemplo:
egrep 'fo+b?r' foobarbaz.txtUn fragmento de la página del manual grep de OSX:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).fuente
grep -Een lugar degrep -Pera exactamente lo que necesitaba.use perl;perl -ne 'print if /regex/' files ...Si necesita más
grepopciones (veo que-oal menos le gustaría ), hay variaspgrepimplementaciones flotando en la red, muchas de ellas en Perl.Si "casi Perl" es lo suficientemente bueno, PCRE incluye
pcregrep.fuente
No hay otra alternativa:
pcregrep.Pcregrep es un grep con expresiones regulares compatibles con Perl. Tiene exactamente el mismo uso que
grep -P. Entonces será compatible con tus scripts.Se puede instalar con homebrew:
brew install pcrefuente
Error: No available formula for pcregrep¿Qué tal usar la opción '-E'? Funciona bien para mí, por ejemplo, si quiero comprobar si hay una
php_zip,php_xml,php_gd2la extensión de php -m uso I:php -m | grep -E '(zip|xml|gd2)'fuente
Equivalente a la respuesta aceptada, pero sin el requisito del interruptor -P, que no estaba presente en las dos máquinas que tenía disponibles.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'fuente
Este funcionó para mí:
awk -F":" '/PATTERN/' file.txtfuente
Otra solución de Perl para -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)fuente
use la expresión regular de una línea de perl pasando la salida de búsqueda con una tubería. Solía búsqueda hacia atrás (obtener src enlaces en html) y la búsqueda hacia delante para " y pasé la salida de rizo (html) a la misma.
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 2016fuente