Parece que la nueva versión de OSX ya no es compatible grep -P
y, 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.grep
realidad cambió degrep (GNU grep) 2.5.1
10.7 agrep (BSD grep) 2.5.1-FreeBSD
10.8. Supongo que fue por GPL. FreeBSDgrep
también está basado en GNUgrep
y ambas versiones degrep
2002.--label
y-u
/--unix-byte-offets
también fueron eliminadas en 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, Y-p
se añadieron en 10,8.-Z
cambiado de--null
a--decompress
.grep
que 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/null
toma 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.txt
a
perl -nle'print if m{PATTERN}' file.txt
y cambio
grep -o -P 'PATTERN' file.txt
a
perl -nle'print $& while m{PATTERN}g' file.txt
Entonces 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 -1
al final de la canalización.grep
siempre 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
grep
desdehomebrew-core
el uso debrew
:brew install grep
Entonces está disponible como
ggrep
(GNUgrep
). no reemplaza el sistemagrep
(debe colocar el grep instalado antes que el del sistemaPATH
).La versión instalada por
brew
incluye la-P
opció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-names
opció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/bin
al 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-names
es agregarloalias grep='ggrep'
a su perfil de bash y dejar que los embaucadores de cerveza mantengan su prefijo--with-default-names
se retira de la preparación. Tenía quebrew install grep
conseguir 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
ack
está diseñado para ser autónomo; no es necesario que lo instales. Si puede guardar un archivo, marcarlo como ejecutable y actualizarloPATH
si es necesario, ya está listo.ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
significa lo mismo, pero no necesitas el-P
con ack)OS X tiende a proporcionar BSD en lugar de herramientas GNU. Que no vienen con
egrep
sin embargo, que es probablemente todo lo que necesita para llevar a cabo búsquedas de expresiones regulares.ejemplo:
egrep 'fo+b?r' foobarbaz.txt
Un 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 -E
en lugar degrep -P
era exactamente lo que necesitaba.use perl;
perl -ne 'print if /regex/' files ...
Si necesita más
grep
opciones (veo que-o
al menos le gustaría ), hay variaspgrep
implementaciones 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 pcre
fuente
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_gd2
la 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.txt
fuente
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 2016
fuente