您可能已经知道,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 目前不支持您执行此操作的方法。您有以下选择:
- 使用 Perl
- 使用
grep [-P|--perl-regexp]
- 使用 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
.它随pcre
CentOS 和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.