我想使用来自/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
我写了这个正则表达式,但它无法正常工作:
expr /home/user1/subdir/foo_1/foo_2 : '\/home\/user1\/\(.*\/\)\{1\}'
,但似乎是subdir/foo_1
代替subdir
。
谢谢!
答案 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