Как работает это регулярное выражение - PullRequest
1 голос
/ 31 марта 2010

Я нашел скрипт со следующим фрагментом: -

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

Возвращает идентификатор пользователя.

Когда я пытался узнать, как это происходит: -

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

Итак, я понял, что (. [0-9a-z] *) соответствует идентификатору пользователя. Но если бы я разместил, как показано ниже:

#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 ]

3 голосов
/ 31 марта 2010
  • Подвыражение (\(.[0-9a-z]*\)) соответствует группе, содержащей скобки и идентификатор пользователя.
  • Точка внутри этого регулярного выражения соответствует только первому символу, а все остальные должны быть в любом случае строчными или числовыми.1005 *
  • Так что очевидно, что регулярное выражение здесь не чувствительно к регистру (опция i) по умолчанию.Поскольку ваше имя пользователя только [a-z0-9], оно все равно совпадает.
  • Я не думаю, что точка имеет смысл.Есть ли действительные имена пользователей, начинающиеся не с буквы?Точка находится здесь, чтобы убедиться, что имя пользователя имеет длину не менее одного символа.
  • Лучше может быть (\([0-9a-z]+\)) тогда.
0 голосов
/ 31 марта 2010

это не объяснит регулярное выражение, но альтернативные способы получить ваш идентификатор.

$ id -u -n

$ id|sed 's/uid=[0-9]*(//;s/).*//'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...