代码之家  ›  专栏  ›  技术社区  ›  Tommy B.

使用regex从unix路径提取用户名

  •  1
  • Tommy B.  · 技术社区  · 16 年前

    我需要从具有以下格式的Unix路径获取用户名: /主页/用户/myusername/project/number/files

    我只想要“我的用户名”,我已经试了将近一个小时了,完全没有头绪。

    有什么想法吗?

    谢谢!

    5 回复  |  直到 16 年前
        1
  •  0
  •   Robusto    16 年前
    (\/home\/users\/)([^\/]+)
    

    第二个捕获组(索引1)将 myusername

        2
  •  5
  •   phimuemue    16 年前

    也许只是 /home/users/([a-zA-Z0-9_\-]*)/.* ?

    注意关键部分 [a-zA-Z0-9_\-]* 必须包含Unix用户名的所有有效字符。我从 here ,用户名只能包含数字、字符、短划线和下划线。

    还要注意,提取的用户名不是整个匹配,而是第一组(由 (...) )

        3
  •  2
  •   Steve Weet    16 年前

    最好的答案取决于你想要达到的目标。如果您想知道拥有该文件的用户,那么您可以使用stat命令,不幸的是,根据操作系统,它的语法略有不同,但是以下两个命令可以工作

    最大操作系统/X

    stat -f '%Su' /home/users/myusername/project/number/files
    

    红帽/软呢帽/Centos

    stat -c '%U' /home/users/myusername/project/number/files
    

    如果您真的想要字符串跟在/home/users后面,那么上面提供的任何一个regex都会这样做,您可以在bash脚本中使用它,如下所示(mac os/x)

    USERNAME=$(echo '/home/users/myusername/project/number/files' | \
      sed -E -e 's!^/home/users/([^/]+)/.*$!\1!g')
    
        4
  •  1
  •   TK.    16 年前

    检查 http://rubular.com/r/84zwJmV62G . 第一个匹配,而不是整个匹配,是用户名。

        5
  •  1
  •   Alan Horn    16 年前

    在Bourne壳中,类似于:

    string="/home/users/STRINGWEWANT/some/subdir/here"
    echo $string | awk -F\/ '{print $3}'
    

    将是一个选项,假设它始终是路径的第三个元素。更轻的是只使用外壳内置:

    echo ${x#*users/}
    

    将删除“用户/之前的所有内容

    echo ${y%%/*}
    

    将去掉其余部分。

    所以要把它们放在一起:

    export path="/home/users/STRINGWEWABT/some/other/dirs"
    export y=`echo ${path#*users/}` && echo ${y%%/*}
    STRINGWEWABT
    

    同时,检查bash手册页并搜索“参数扩展”