grep -P不再有效.我怎样才能重写我的搜索?

kug*_*sha 74 macos shell perl

看起来OSX的新版本不再支持grep -P,因此我的一些脚本停止工作.

var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Run Code Online (Sandbox Code Playgroud)

我需要将grep捕获到变量,我需要使用零宽度断言,以及 \K

var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Run Code Online (Sandbox Code Playgroud)

任何替代方案将不胜感激.

dre*_*cko 79

如果你的脚本仅供您使用,您可以安装grephomebrew-core使用brew:

brew install grep 
Run Code Online (Sandbox Code Playgroud)

当您指定时ggrep,它将替换系统grep(实际上,将已安装的grep放在系统之前grep).

安装的版本PATH包含该brew选项,因此您无需更改脚本.

如果你没有安装-P,那么它可用作--with-default-names(GNU grep).

  • `--with-default-names`的替代方法是在你的bash配置文件中添加`alias grep ='ggrep'`并让brew dupes保留其前缀 (9认同)
  • 从brew中删除--with-default-names。我必须`brew install grep`来获取ggrep,然后按照@rymo的话做,并做'alias grep ='ggrep'`。 (4认同)
  • @pepper什么不行?可能路径没有正确设置 - 什么是`grep`的输出?应该是`/ usr/local/bin/grep`.它;在您仔细检查出现问题之前,有点意思是downvote! (3认同)
  • 将`/ usr / local / bin`添加到PATH的前面可能更好。我相信布鲁尔应该设置这个吗?您是否使用过--default-names?无论如何,很高兴它能工作(:不确定围绕它进行黑客攻击,但我认为积分系统是该站点拥有如此出色资源的原因之一。 (2认同)

ike*_*ami 58

如果您想完成最少量的工作,请进行更改

grep -P 'PATTERN' file.txt
Run Code Online (Sandbox Code Playgroud)

perl -nle'print if m{PATTERN}' file.txt
Run Code Online (Sandbox Code Playgroud)

并改变

grep -o -P 'PATTERN' file.txt
Run Code Online (Sandbox Code Playgroud)

perl -nle'print $& while m{PATTERN}g' file.txt
Run Code Online (Sandbox Code Playgroud)

所以你得到:

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`
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,您可以通过额外的工作实现更简单的代码.

var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
Run Code Online (Sandbox Code Playgroud)

  • @Christian,使用适当的 XML 解析器(例如 XML::LibXML)只需 3 行即可。(关键行:`say $_-&gt;textContent for $doc-&gt;findnodes('//loc');`) (2认同)

Mic*_*man 12

安装确认并改为使用它.Ack是用Perl编写的grep替换.它完全支持Perl正则表达式.


neb*_*ous 10

OS X倾向于提供BSD而不是GNU工具.然而,它确实带来了egrep执行正则表达式搜索所需的全部内容.

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

来自OSX grep手册页的代码片段:

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

  • 不推荐直接调用egrep.同样的能力也可以作为grep -E使用.它是...... Perl的悲伤阴影,缺乏外观断言,大多数反斜杠逃逸,选项,条件等等:(高级用户会讨厌它,但它确实至少可以完成这项工作. (3认同)
  • 谢谢。`grep -E` 而不是 `grep -P` 正是我所需要的。 (2认同)

tri*_*eee 6

use perl;

perl -ne 'print if /regex/' files ...
Run Code Online (Sandbox Code Playgroud)

如果你需要更多grep选项(我看到你-o至少想要)pgrep,网上有各种各样的实现,其中很多都是在Perl中.

如果"几乎Perl"足够好,PCRE随附pcregrep.


Gab*_*ton 5

还有另一种选择:pcregrep.

Pcregrep是一个带有Perl兼容正则表达式的grep.它具有完全相同的用法grep -P.因此它将与您的脚本兼容.

它可以与自制软件一起安装:

brew install pcre