看起来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
如果你的脚本仅供您使用,您可以安装grep从homebrew-core使用brew:
brew install grep
Run Code Online (Sandbox Code Playgroud)
当您指定时ggrep,它将替换系统grep(实际上,将已安装的grep放在系统之前grep).
安装的版本PATH包含该brew选项,因此您无需更改脚本.
如果你没有安装-P,那么它可用作--with-default-names(GNU grep).
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)
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).
use perl;
perl -ne 'print if /regex/' files ...
Run Code Online (Sandbox Code Playgroud)
如果你需要更多grep选项(我看到你-o至少想要)pgrep,网上有各种各样的实现,其中很多都是在Perl中.
如果"几乎Perl"足够好,PCRE随附pcregrep.
| 归档时间: |
|
| 查看次数: |
34785 次 |
| 最近记录: |