KornShell中的正则表达式

时间:2010-01-23 00:04:45

标签: regex shell unix ksh

我试图检查一个变量是否恰好是两个数字,但我似乎无法弄明白。

如何在KornShell(ksh)中检查正则表达式(正则表达式)?

我试过了:

if [[ $month =~ "[0-9]{2}" ]]
if [[ $month = _[0-9]{2}_ ]]

我无法在其上找到任何文档。

有什么见解?

5 个答案:

答案 0 :(得分:8)

case $month in
    [0-9][0-9]) echo "ok";;
    *) echo "no";;
esac

应该有用。

如果您需要完整的正则表达式搜索,可以使用egrep,如下所示:

if echo $month | egrep -q '^[0-9]{2}$'
then
    echo "ok"
else
    echo "no"
fi

答案 1 :(得分:7)

Ksh支持ksh88以来的有限扩展模式,使用

special '(' pattern ')'

语法。

在ksh88中,'特殊'字符前缀会改变预期的匹配数:

'*' for zero or more matches
'+' at least one match
'@' for exactly one match
'?' for zero or one matches
'!' for negation

在ksh93中,这是用

扩展的
'{' min ',' max '}'

表示确切的范围:

for w in 1423 12 "" abc 23423 9 33 3  333
do
  [[ $w == {1,3}(\d) ]] && print $w has between 1 and three digits
  [[ $w == {2}(\d) ]] && print $w has exactly two digits
done

最后,你可以使用'〜'来实现类似perl的混乱,它引入了一个全新的扩展类,包括完整的正则表达式:

'〜(E)(正则表达式)'

更多示例可以在Finnbarr P. Murphy's blog

中找到

答案 2 :(得分:5)

我来自哪里,这更有可能验证数字月份:

if (( $month >= 1 && $month <= 12 ))

[[ $month =~ ^([1-9]|1[012])$ ]]

或包括一位数的月份前导零:

[[ $month =~ ^(0[1-9]|1[012])$ ]]

答案 3 :(得分:3)

ksh不使用正则表达式;它使用了一种更简单但仍然非常有用的语言,叫做“shell globbing patterns”。关键的想法是

  • 类似[0-9][chly]的类与该类中的任何字符匹配。
  • .不是特殊字符;它只匹配.
  • ?匹配任何单个字符。
  • *匹配任何字符序列。
  • 与正则表达式不同,shell globbing模式必须与整个单词匹配,因此它就像是一个regexp,它始终以^开头并以$结尾

Globbing模式不如正则表达式强大,但它们更容易阅读,并且它们非常便于匹配文件名和简单单词。 case构造是我最喜欢的匹配,但还有其他构建。

正如Alok已经提到的,你可能想要

case $number in
  [0-9][0-9]) success ;;
  *) failure;;
esac

虽然您可能不希望将两位数字与初始零匹配,但是更喜欢[1-9][0-9]

答案 4 :(得分:0)

你也可以试试这个

$ month=100
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
no
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
no
$ month=10
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
ok
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
ok