强制 Bash 使用 Perl RegEx 引擎

强制 Bash 使用 Perl RegEx 引擎

您可能已经知道,Bash RegEx 引擎不支持现代 RegEx 引擎支持的许多功能(反向引用、环视断言等)。以下是我刚刚创建的一个简单的 Bash 脚本,用于解释我的最终目标:

#!/bin/bash

# Make sure exactly two arguments are passed.
if [ $# -lt 2 ]
then
    echo "Usage: match [string] [pattern]"
    return
fi

variable=${1}
pattern=${2}

if [[ ${variable} =~ ${pattern} ]]
then
    echo "true"
else
    echo "false"
fi

例如,类似以下命令将返回 false:

. match.sh "catfish" "(?=catfish)fish"

而在 Perl 或 JavaScript 正则表达式测试器中使用完全相同的表达式将找到匹配项。

反向引用(例如 (expr1)(expr2)[ ]\1\2)也不会匹配。

我只是得出这样的结论:只有强制 bash 使用与 Perl 兼容的 RegEx 引擎时,我的问题才能得到解决。这可行吗?如果是这样,我将如何执行该程序?

答案1

Bash 目前不支持您执行此操作的方法。您有以下选择:

  1. 使用 Perl
  2. 使用grep [-P|--perl-regexp]
  3. 使用 Bash 功能进行编码

我想我会选择#2,并尝试使用它grep来获得我想要的功能。对于反向引用,您可以执行以下操作grep

$ echo 'BEGIN `helloworld` END' | grep -oP '(?<=BEGIN `).*(?=` END)'
helloworld

-o, --only-matching       show only the part of a line matching PATTERN
-P, --perl-regexp         PATTERN is a Perl regular expression

(?=pattern)
    is a positive look-ahead assertion
(?!pattern)
    is a negative look-ahead assertion
(?<=pattern)
    is a positive look-behind assertion
(?<!pattern)
    is a negative look-behind assertion 

参考

答案2

一个可以使用pcregrep.它随pcreCentOS 和Ubuntu 中的软件包一起提供pcregrep

grep -P根据操作系统/版本的不同,可能会出现此问题:

-P, --perl-regexp
              Interpret PATTERN as a Perl regular expression.  This is highly experimental and grep -P may warn of unimplemented features.

相关内容