regex在perl中工作,在bash中无法匹配,在zsh中工作,但BASH_REMATCH为空 &


for d in "A - test1 (a)" "B - test2 (b)";
do
if [[ "$d" =~ -s(.*?)s( ]];
then
D="${BASH_REMATCH[1]}"
echo "$d --> $D : $BASH_REMATCH"
else
echo "NO MATCH $d"
fi
done

bash输出

NO MATCH A - test1 (a)
NO MATCH B - test2 (b)

在zsh中,失败

zsh: failed to compile regex: Unmatched ( or (

如果我在zsh中修改表达式为[[ "$d" =~ "-s(.*?)s(" ]],它匹配但没有捕获

A - test1 (a) -->  : 
B - test2 (b) -->  :

使用相同的正则表达式的Perl脚本可以工作

$x="A - test1 (a)";
if ($x =~ /-s(.*?)s(/) {
print "$x -> $1n";
} else {
print "No match: $xn";
}

按预期输出A - test1 (a) -> test1

如何使regex工作(从A - test1 (a)提取test作为本例)在bash和zsh?

使用bash使用[[:space:]]代替s并删除?:

for d in "A - test1 (a)" "B - test2 (b)"; do
if [[ "$d" =~ -[[:space:]]([^[:space:]]*)[[:space:]]( ]]; then
D="${BASH_REMATCH[1]}"
echo "$d --> $D"
else
echo "NO MATCH $d"
fi
done
A - test1 (a) --> test1
B - test2 (b) --> test2

对于zsh,它几乎是相同的,除了必须使用match而不是BASH_REMATCH,并引用regexp的最后括号:

for d in "A - test1 (a)" "B - test2 (b)"; do
if [[ "$d" =~ -[[:space:]]([^[:space:]]*)[[:space:]]'(' ]]; then
D="${match[1]}"
echo "$d --> $D"
else
echo "NO MATCH $d"
fi
done
A - test1 (a) --> test1
B - test2 (b) --> test2

最新更新