看起来 OS X 的新版本不再支持 grep -P,因此导致我的一些脚本停止工作,例如:
grep -P
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
我需要将 grep 的结果捕获到一个变量,并且需要使用零宽度断言,以及 \K:
\K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
如果有其他选择,我将不胜感激。
use perl;
perl -ne 'print if /regex/' files ...
如果您需要更多的 grep选项(我看到您至少希望使用 -o) ,那么网络上有各种各样的 pgrep实现,其中许多是用 Perl 实现的。
grep
-o
pgrep
如果“几乎 Perl”足够好,PCRE 将提供 pcregrep。
pcregrep
P 的另一个 Perl 解决方案
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
安装 啊并使用它。Ack 是用 Perl 编写的 grep 替换。它完全支持 Perl 正则表达式。
如果你想做最少量的工作,改变
grep -P 'PATTERN' file.txt
到
perl -nle'print if m{PATTERN}' file.txt
和改变
grep -o -P 'PATTERN' file.txt
perl -nle'print $& while m{PATTERN}g' file.txt
所以你会得到:
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`
在您的特定情况下,您可以通过额外的工作来实现更简单的代码。
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt` var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
如果您的脚本仅供使用,您可以使用 brew从 homebrew-core安装 grep:
brew
homebrew-core
brew install grep
然后它可以作为 ggrep(GNU grep)。 它不会替换系统 grep(您需要将已安装的 grep 放在 PATH上的系统 grep 之前)。
ggrep
PATH
brew安装的版本包含 -P选项,所以您不需要更改脚本。
-P
如果需要将这些命令与它们的正常名称一起使用,则 可以从 bashrc 向 PATH 添加一个“ gnubin”目录,如下所示:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
您可以在 ~/. bashrc 或 ~/. zhrc 上导出这一行,以便在新的会话中保留它。
请参阅 给你来讨论旧的 --with-default-names选项的优缺点以及它(最近)的删除。
--with-default-names
还有另一种选择: pcregrep。
Pcregrep 是一个具有与 Perl 兼容的正则表达式的 grep。它的用法与 grep -P完全相同。因此它将与您的脚本兼容。
它可以安装自制程序:
brew install pcre
OS X 倾向于提供 BSD 而不是 GNU 工具。然而,是的附带了 egrep,这可能就是执行正则表达式搜索所需的全部内容。
egrep
例子: egrep 'fo+b?r' foobarbaz.txt
egrep 'fo+b?r' foobarbaz.txt
来自 OSX grep 手册页的一个片段:
Grep 用于简单模式和基本正则表达式(BRE) ; egrep 可以处理扩展正则表达式(ERE)。
相当于接受的答案,但没有-P 开关的要求,这是不存在的两台机器,我有可用的。
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
这个对我很管用:
awk -F":" '/PATTERN/' file.txt
通过使用管道传递 find 输出来使用 perl 一行程序正则表达式。 我对 "使用 往后看(在 html 中获取 SRC链接)和 向前看,并将 curl (html)的输出传递给它。
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
用“-E”选项怎么样? 对我来说挺好的, 例如,如果我想检查 php_zip,php_xml,php_gd2从 Php-m扩展,我使用:
php_zip
php_xml
php_gd2
php -m | grep -E '(zip|xml|gd2)'
我遇到了同样的问题,grep 突然在一个码头上重建,我在这里找到了解决方案: https://github.com/firehol/firehol/issues/325
刚把 -oP 换成了 -oE
echo $some_var | grep -oE '\b[0-9a-f]{5,40}\b' | head -1
还有一些选项可以设置正确的退出状态:
相当于“ grep-P“ PATTERN”:
Cat FILE | perl-e‘ while (< >){ if ((m! PATTERN!)){ $ok + + ; print }} ; if (! ($ok)){ exit 1}’
相当于‘ grep-P-i‘ PATTERN’:
Cat FILE | perl-e‘ while (< >){ if ((m! PATTERN! i)){ $ok + + ; print }} ; if (! ($ok)){ exit 1}’
相当于‘ grep-v-P‘ PATTERN’:
Cat FILE | perl-e‘ while (< >){ if (! (m! PATTERN!)){ $ok + + ; print }} ; if (! ($ok)){ exit 1}’
为了获得更清晰的解决方案,可以使用以下主旨实现的开关:-A,-B,-v,-P,-i: https://gist.github.com/torson/bd6931bda0035c4884b2a8c4c64a33b2