这个正则表达式如何工作

时间:2010-03-31 08:43:45

标签: regex shell

我找到了一个包含以下代码段的脚本: -

userid=`expr "\`id\`" : ".*uid=[0-9]*(\(.[0-9a-z]*\)) .*"`

返回用户ID。

当我试图了解它是如何做的时候: -

#id
#uid=11008(adilm) gid=1200(cvs),1400(build)

所以我意识到(。[0-9a-z] *)与userid匹配。但如果我放置如下:

#userid=`expr "uid=11008(ADILM) gid=1200(cvs),1400(build)" : ".*uid=[0-9]*(\(.[0-9a-z]*\)) .*"`
#echo $userid
ADILM

有效。根据我的理解'。'与ADILM匹配。但当我删除'。'如下: -

#userid=`expr "uid=11008(ADILM) gid=1200(cvs),1400(build)" : ".*uid=[0-9]*(\([0-9a-z]*\)) .*"`
#echo $userid
ADILM

它仍然有效吗?我们只提供了小写字母,但它仍在使用。

2 个答案:

答案 0 :(得分:3)

  • 子表达式(\(.[0-9a-z]*\))匹配包含括号和用户ID的组。
  • 此正则表达式中的点只匹配第一个字符,而其他所有字符都需要小写或数字。
  • 所以很明显,这里的正则表达式默认情况下不区分大小写(i选项)。由于您的用户名仅为[a-z0-9],因此仍然匹配。
  • 我不认为这个点有意义。是否有任何有效的用户名不以字母开头?点是为了确保用户名长度至少为一个字符。
  • 可能会更好(\([0-9a-z]+\))

答案 1 :(得分:0)

这不会解释正则表达式,而是替代方法来获取您的身份。

$ id -u -n

$ id|sed 's/uid=[0-9]*(//;s/).*//'