ram*_*ram 3 regex bash posix zsh
如何在 zsh 中使用正则表达式变量,就像在 bash 中一样?我只能让 zsh 使用内联正则表达式。我只是想测试一个只包含字母数字、下划线或句点的字符串,但不包含破折号。正如您所看到的,内联正则表达式和正则表达式变量在 bash 中按预期工作,但 zsh 只匹配内联正则表达式。
\n#!/bin/bash\n\nRE='[0-9A-Za-z_\\.]'\n\nfor test in $@; do\n echo -e "bash test: $test"\n\n if [[ "${test//[0-9A-Za-z_\\.]/}" = "" ]]; then\n echo -e '\\tmatch inline'\n fi\n\n if [[ "${test//$RE/}" = "" ]]; then\n echo -e '\\tmatch var'\n fi\n\ndone\n\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x9d\xaf./bash-regex-test.sh foo_bar foo-bar
\n输出:
\n\nbash test: foo_bar\n match inline\n match var\nbash test: foo-bar\n\nRun Code Online (Sandbox Code Playgroud)\n#!/bin/zsh\n\n\nRE='[0-9A-Za-z_\\.]'\n\nfor test in $@; do\n echo "zsh test: $test"\n\n if [[ "${test//[0-9A-Za-z_\\.]/}" = "" ]]; then\n echo '\\tmatch inline'\n fi\n\n if [[ "${test//$RE/}" = "" ]]; then\n echo '\\tmatch var'\n fi\n\ndone\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x9d\xaf./zsh-regex-test.zsh foo_bar foo-bar
\n输出:
\nzsh test: foo_bar\n match inline\nzsh test: foo-bar\n\nRun Code Online (Sandbox Code Playgroud)\n
tsh*_*ono 14
您需要zsh使用${~RE}而不是$RE变量$RE
被视为模式,而不是文字字符串。然后将该行更改为:
if [[ "${test//${~RE}/}" = "" ]]; then
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您使用的$RE不是正则表达式,而是路径名扩展中的模式。
为了将其用作正则表达式,您需要使用=~运算符:
#!/bin/zsh
RE='^[0-9A-Za-z_\.]+$'
for test in "$@"; do
echo "zsh test: $test"
if [[ $test =~ ^[0-9A-Za-z_\.]+$ ]]; then
echo '\tmatch inline'
fi
if [[ $test =~ $RE ]]; then
echo '\tmatch var'
fi
done
Run Code Online (Sandbox Code Playgroud)