Bash / zsh:从字符串中的最后一个匹配中获取子字符串

时间:2011-05-06 09:01:22

标签: bash shell zsh

在shell脚本中,我有一个变量$PATH,如下所示:/foo8232/test874-ab/bar/test-82-x。我现在想得到一个子字符串,在这个特定情况下得到结果test-82-x

因此,我必须匹配/test.*的出现次数,但只匹配字符串末尾的最后一个元素OR。无论什么效果最好。

对此有何帮助?

修改 感谢您快速提供如此多的解决方案。其中一些不起作用。不确定,但也许问题是,我的路径实际上有空格,看起来更像这样:/foo12323/test34 - 343bar/test - 234/test - 4323.txt。对不起,我首先没有提到它,如果这会引起麻烦。

5 个答案:

答案 0 :(得分:4)

对于您的特定路径管理,您已获得基本名称功能:

basename /foo8232/test874-ab/bar/test-82-x
>>> test-82-x

或在脚本中:

#!/bin/bash
fullfilename=$(basename $1)
extension=${fullfilename##*.}
filename=${fullfilename%.*}

echo "fullfilename=$fullfilename"
echo "extension=$extension"
echo "filename=$filename"

给出:

./file_name.sh /foo8232/test874-ab/bar/test-82-x
fullfilename=test-82-x
extension=
filename=test-82-x

答案 1 :(得分:1)

因此,您正在寻找以test开头的最后一个目录组件。

怎么样

IFS=/
for dir in $PATH; do
    case $dir in test*)
        match=$dir;;
    esac
done

答案 2 :(得分:1)

以下内容应符合POSIX标准

BASE=$(basename $PATH)
if echo $BASE | grep "^test.*" > /dev/null; then
  # do something awesome
fi

答案 3 :(得分:1)

包含test的最后一个路径元素也可以在sed找到:

elem=$(echo $PATH | sed -r 's#.*/(test[^/]*).*#\1#')

或没有-r(使用扩展正则表达式):

elem=$(echo $PATH | sed 's#.*/\(test[^/]*\).*#\1#')

答案 4 :(得分:-1)

echo pwd | awk -F \ /'{print $ NF}'| grep test