您可能已经知道,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引擎时,我的问题才能解决。这可行吗?如果是这样,我将如何执行该程序?
5
您为什么不只使用perl而不是bash来编写脚本?为什么这个问题标记为javascript?
—
Marco Marco
因为在我的情况下必须使用Bash。而且我不小心标记了JavaScript。我将其删除了:)
—
Fadi Hanna AL-Kass 2013年
为什么不
—
cuonglm
grep
与一起-P
使用sed
?
但是,您永远无法解释导致您得出结论,那就是您必须让shell执行它根本无法执行的操作的情况/问题。有更好的方法。
—
llua
我发现反向引用确实可以在bash 4.3.x(Ubuntu 14.04)中工作,但不能在bash 3.2x(OS X)中工作。这是我的测试命令:
—
Digital Trauma 2015年
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}