从路径中提取子目录的名称

时间:2011-10-19 19:40:20

标签: regex bash path

我想使用来自/home/user1/subdir/foo_1/foo_2/.../foo_n之类的路径的bash脚本来提取子目录名称。 subdir将始终位于/home/user1下,因此前缀不变,但subdir

下的子目录数量可能不同

一些例子:

  • / home / user1 / dir1 / something / like / this:RESULT:dir1

  • / home / user1 / dir2 / different / this / time /:RESULT:dir2

  • / home / user1 / dir3 / this / is / the / last / example:RESULT:dir3

我写了这个正则表达式,但它无法正常工作:

 expr /home/user1/subdir/foo_1/foo_2 : '\/home\/user1\/\(.*\/\)\{1\}'

,但似乎是subdir/foo_1代替subdir

谢谢!

4 个答案:

答案 0 :(得分:3)

问题是匹配是以贪婪的方式完成的。 .*将尽可能多地匹配,在您的情况下,它意味着它将匹配多个斜杠,当您真的希望它停在第一个斜杠时。

您应该在/home/user1/后但在下一个/

之前专门匹配所有内容
expr /home/user1/subdir/foo_1/foo_2 : '\/home\/user1\/\([^\/]*\)'

输出:

subdir

答案 1 :(得分:2)

(?<=/home/user1/)[^/]+(?=/)

试验:

kent$  echo "/home/user1/dir1/something/like/this"|grep -oP "(?<=/home/user1/)[^/]+(?=/)"
dir1

答案 2 :(得分:2)

如果可以使用临时变量,shell可以自行完成。

t=${path#/home/user1/}
subdir=${t%/*}

答案 3 :(得分:0)

dir=/home/user1/subdir/foo_1/foo_2/.../foo_n
sub=$( IFS=/; set -- $dir; echo $4 )
echo $sub   # => subdir