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