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

Bash/zsh:从字符串中的最后一个匹配中获取子字符串,bash,shell,zsh,Bash,Shell,Zsh,在shell脚本中,我有一个变量$PATH,它可能如下所示:/foo8232/test874 ab/bar/test-82-x。我现在想要得到这个的一个子串,在这个特定的例子中得到结果test-82-x 因此,我必须匹配出现的/test.*,但只能匹配最后一个元素或字符串末尾的元素。什么最管用 有什么帮助吗 编辑: 感谢您如此快速地提供了如此多的解决方案。但其中有一些不起作用。不确定,但可能问题是,我的路径实际上有空格,而且更多类似于这样:/foo12323/test34-343bar/test

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

因此,我必须匹配出现的
/test.*
,但只能匹配最后一个元素或字符串末尾的元素。什么最管用

有什么帮助吗

编辑:
感谢您如此快速地提供了如此多的解决方案。但其中有一些不起作用。不确定,但可能问题是,我的路径实际上有空格,而且更多类似于这样:
/foo12323/test34-343bar/test-234/test-4323.txt
。很抱歉,如果一开始没有提到它会引起麻烦的话。

那么您正在查找以
test
开头的最后一个目录组件

怎么样

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

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

怎么样

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

对于特定的路径管理,您有basename函数:

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

对于特定的路径管理,您有basename函数:

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

以下内容应与POSIX兼容

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

以下内容应与POSIX兼容

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

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

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

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

elem=$(echo $PATH | sed -r 's#.*/(test[^/]*).*#\1#')
或不带
-r
(使用扩展正则表达式):


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

elem=$(echo $PATH | sed -r 's#.*/(test[^/]*).*#\1#')
或不带
-r
(使用扩展正则表达式):


旁白:不要调用变量
PATH
。这将影响可以运行的命令。旁白:不要调用变量
PATH
。这将影响可以运行的命令。不幸的是,Mac OS X sed没有
-r
。感谢您的更新。仍然不起作用,但可能是因为我的路径中有空格。更新了问题。很抱歉。事实上这不应该是个问题。
echo/foo12323/test34-343bar/test-234/test-4323.txt“| sed的#.*/\(test[^/]*\).\1#”
给了我
test-4323.txt
。嗯,可能是我做错了什么。我稍后再查。谢谢:-)不幸的是,Mac OS X sed没有
-r
。谢谢您的更新。仍然不起作用,但可能是因为我的路径中有空格。更新了问题。很抱歉。事实上这不应该是个问题。
echo/foo12323/test34-343bar/test-234/test-4323.txt“| sed的#.*/\(test[^/]*\).\1#”
给了我
test-4323.txt
。嗯,可能是我做错了什么。我稍后再查。谢谢:-)对我不起作用,但可能是因为我的路径中有空格。更新了问题。很抱歉。为什么
echo pwd
?这将只打印“pwd”。除非你的意思是
echo`pwd`
,但这和
pwd
是一样的。应该是
echo$PATH
(问题中的变量被称为)对我不起作用,但可能是因为我的路径中有空格。更新了问题。很抱歉。为什么
echo pwd
?这将只打印“pwd”。除非你的意思是
echo`pwd`
,但这和
pwd
是一样的。应该是
echo$PATH
(问题中的变量被称为)谢谢
basename
的提示。这是一个非常简单的解决方案:-)感谢
basename
的提示。这是一个非常简单的解决方案:-)