所以我给自己创造了一个可爱的巴什脚本:
#!/usr/bin/env bash
TEXT="FOO BAR"
REGEX="FOO (.+)"
if [[ $TEXT =~ $REGEX ]]; then
echo "Matched ${BASH_REMATCH[1]}"
else
echo "No match."
fi很基本的。如果运行./cutescript.sh,就会得到结果:
Matched BAR但是,如果我源脚本. ./cutescript.sh,那么它仍然匹配,但BASH_REMATCH[1是空的。
哇哦。
我在MacOS Catalina 10.15.7 (19H2)上,在zsh中执行此操作,但使用bash shebang。
有人能解释一下这种不规律吗?
发布于 2020-10-20 08:56:34
现在,由于我知道BASH_REMATCH在zsh中根本不存在,我做了更多的调查:
这篇文章实际上是重复的。这里还有另一个问题解释了解决方案:BASH_REMATCH doesn't capture
设置选项KSH_ARRAYS BASH_REMATCH允许zsh模仿bash的正则表达式功能。
使上面的脚本与zsh兼容的一个简单方法是:
#!/usr/bin/env bash
# Ensures that BASH_REMATCH works if called in zsh.
setopt KSH_ARRAYS BASH_REMATCH
TEXT="FOO BAR"
REGEX="FOO (.+)"
if [[ $TEXT =~ $REGEX ]]; then
echo "Matched ${BASH_REMATCH[1]}"
else
echo "No match."
fi
unsetopt KSH_ARRAYS BASH_REMATCH发布于 2020-10-19 15:21:39
当您使用.读取文件时,它将由您正在运行的任何shell执行--在本例中,您说您在zsh中。顾名思义,BASH_REMATCH数组的名称是特定于bash的;例如,如果您的shell是zsh,那么在本例中匹配的文本将在$match[1]中找到。我认为ksh根本没有真正的正则匹配。
https://stackoverflow.com/questions/64429740
复制相似问题