我希望在 KSH 中做这样的事情:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
有可能吗?
作为记录,我Version M-11/16/88i
在 Solaris 10 计算机上使用 Ksh。
答案1
Ksh 有正则表达式,但不是通常的语法(不是Solaris 10 中的版本)。
if [[ $var = *@(foo|bar)*([0-9]) ]]; then …
在里面手动的,在“条件表达式”下查找括号内的内容,在“文件名生成”下查找模式语法。
答案2
与 glob 模式一起使用case
可能适合您。复合模式*(pattern-list)
意味着“匹配零次或多次出现的给定模式”,并且@(pattern-list)
意味着“精确匹配给定模式之一”。
matcher() {
typeset var="$1"
case "$var" in
*@(foo|bar)*([0-9])) print "$var matched" ;;
*) print "$var did not match" ;;
esac
}
for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do
matcher "$var"
done
输出:
foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
答案3
为什么不使用埃格勒普(1)?为您提供正则表达式用户所希望的一切:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Solaris 的附加说明:对于 Solaris,您可能需要查看联机帮助页埃格雷普-还有另一个埃格雷普位于的版本/usr/xpg4/bin/egrep
支持更多选项,并且在高级正则表达式方面功能有所不同。
答案4
我知道我参加聚会迟到了,但不是 ktf 的解决方案:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
你也可以使用
if grep -q '(foo|bar)[0-9]*$' <<< "$var" # -q means "quiet" ;-)
then
...
这种与<<<
操作员一起使用的技术称为此处字符串。但是,我还应该添加一个警告:这在只读环境下不起作用(即您将收到丑陋的错误消息stderr
),因为此处的字符串需要将临时文件写入某处。据我所知,使用echo
管道的“经典”方式也可以在没有任何写入权限的情况下工作。