在awk中使用Perl正则表达式(PCRE)



如果我将Perl正则表达式(PCRE)与GNU grep一起使用,它可以很好地工作;请考虑:

$ echo FOO | grep -P '(?i)foo'
FOO

我尝试使用awk进行PCRE,但awk不支持PCRE。

我只为awk/gawk 找到了三个不同的正则表达式修饰符

--posix
--traditional
--re-interval

awk家族中有没有像上面的grep -P示例那样使用Perl正则表达式(PCRE)?

不,awk不支持PerlRE。awk语言的主要原则之一是通过不提供结构来更简短地做简单的事情来保持语言的小型化。这就是他们避免perl所遭受的语言膨胀和相关复杂性的方法(请参阅http://www.zoitz.com/archives/13对于perl可读性的常见感知)。在这种情况下,虽然一些PerlRE语法可以让你做一些更简单的事情,但你不需要特殊的语言结构来做它们,因为有其他方法可以用现有的结构做任何你想做的事情(可能不在一个RE中,或者使用一个函数,所以不那么简单),所以awk不支持它们。

为什么不直接学习Perl
它可以做你在Awk、Sed和bash中能做的一切。(然后是一些)

$ echo FOO | grep -P '(?i)foo'
FOO
$ echo FOO | perl -ne 'print if /(?i)foo/'
FOO
$ ls /bin /usr/bin | perl -lnE '$p{$_}++ if /(grep|sed|awk)$/; END { say for sort keys %p }'
awk
bzegrep
bzfgrep
bzgrep
dgawk
egrep
fgrep
gawk
grep
igawk
list-unreleased
lzegrep
lzfgrep
lzgrep
mawk
msggrep
nawk
pgawk
pgrep
psed
ptargrep
rgrep
sed
xzegrep
xzfgrep
xzgrep
zegrep
zfgrep
zgrep
zipgrep
#! /usr/bin/env perl
use v5.12.0; # sets minimum version adds `say`, and does `use strict`
use warnings;
use File::Spec::Functions qw' path catfile splitpath ';
my %cmds;
# go through all directories in `$PATH` or `%PATH%`
# in a platform independent way
for my $dir_path ( path ){
  # a quick hack that is good enough for now
  for my $cmd_path ( glob catfile $dir_path, '*grep' ){
    # only need the filename, so assign everything else
    # to `undef`
    my ( undef, undef, $cmd ) = splitpath $cmd_path;
    # store it in an array in the %cmds hash
    push @{ $cmds{$cmd} }, $cmd_path;
  }
}
for my $cmd ( sort keys %cmds ) {
  say $cmd, ' :';
  # the actual locations of the program or symlink
  say ' 'x4, $_ for @{ $cmds{$cmd} };
}
bzegrep :
    /bin/bzegrep
bzfgrep :
    /bin/bzfgrep
bzgrep :
    /bin/bzgrep
egrep :
    /bin/egrep
fgrep :
    /bin/fgrep
grep :
    /bin/grep
lzegrep :
    /usr/bin/lzegrep
lzfgrep :
    /usr/bin/lzfgrep
lzgrep :
    /usr/bin/lzgrep
msggrep :
    /usr/bin/msggrep
pgrep :
    /usr/bin/pgrep
ptargrep :
    /opt/perl/bin/ptargrep
    /usr/bin/ptargrep
rgrep :
    /usr/bin/rgrep
xzegrep :
    /usr/bin/xzegrep
xzfgrep :
    /usr/bin/xzfgrep
xzgrep :
    /usr/bin/xzgrep
zegrep :
    /bin/zegrep
zfgrep :
    /bin/zfgrep
zgrep :
    /bin/zgrep
zipgrep :
    /usr/bin/zipgrep

我想指出的是,我之所以有两次ptargrep,是因为我维护了自己的Perl版本,其中一个版本与/opt/perl/bin符号链接,而ptargrep是一个Perl程序,它与Archive::Tar模块一起安装。

这个例子甚至没有使用自2010年5.12.0发布以来添加到Perl中的任何很酷的新特性
(Perl现在有一个年度发布周期)

当然,您也可以使用Perl创建像Lacuna Expanse这样的网站,或者编写像Frozen Bubble这样的视频游戏。


还有一种叫做Perl6的新语言,我觉得使用它更有趣。计划在今年某个时候全面发布。

最新更新