shell脚本中正则表达式中的通配符

时间:2015-03-31 15:32:21

标签: regex bash shell

我有一个关于shell脚本常规表达式中的通配符的问题 vi a.sh

if [[ $1 == 1*3 ]]; then
  echo "matching"
else
  echo "not matching"
fi

如果我运行sh a.sh 123,则输出为:“匹配”。

但根据http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm

  

*(星号)

     

进行中的项目将匹配零次或多次。即。 n *会   匹配n,nn,nnnn,nnnnnnn但不是na或任何其他角色。

它应该只匹配3,13,113,111..3。

但为什么它匹配123?

2 个答案:

答案 0 :(得分:3)

documentation you linked中你正在讨论“正则表达式”。

但是,重要的是“标准通配符(通配模式)”中的内容:

  

标准通配符(通配模式)

     

这可以表示任意数量的字符(包括零,换句话说,零个或多个字符)。如果你指定了“cd *”它   会使用“cda”,“cdrom”,“cdrecord”和任何以...开头的东西   “cd”还包括“cd”本身。 “m * l”可以通过磨,m,ml和   任何以m开头并以l结尾的东西。

也就是说,它不是指前一个字符,而是指一组字符(零个或多个)。它等同于普通正则表达式中的.*

因此,表达式1*3会匹配以1开头+ 0或更多字符+ 3结尾的内容。

答案 1 :(得分:2)

在Unix / Linux World中有两种不同的模式匹配:

  • 正则表达式:这是您在grepsed和许多其他实用程序中找到的复杂模式匹配。随着时间的推移,可以找到许多扩展。这些扩展在POSIX中被称为原始(现在被认为是过时的),现代扩展
  • Globbing :这是指您在执行*.txt等操作时找到的匹配所有文本文件的文件。这些更简单,更简单。有一些扩展名(例如**匹配Ant中的子目录)。

在Bash中使用[[ ... == ... ]] 而不带引号时,您正在使用通配文件匹配。如果要使用正则表达式,则需要使用=~运算符:

if [[ $foo =~ ^11*3 ]]   # Matches 13, 113, 1113, 11113
then