匹配 ksh 中的正则表达式

匹配 ksh 中的正则表达式

我希望在 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管道的“经典”方式也可以在没有任何写入权限的情况下工作。

相关内容