繁体   English   中英

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

[英]Bash/zsh: get substring from the last match in a string

在shell脚本中,我有一个变量$PATH ,看起来像这样: /foo8232/test874-ab/bar/test-82-x 现在,我想获取此内容的子字符串,在此特定情况下,结果为test-82-x

因此,我必须匹配/test.*的出现,但只能匹配字符串末尾的最后一个元素OR。 最好的办法。

有什么帮助吗?

编辑:感谢您提供这么快的解决方案。 他们中的一些虽然不起作用。 不确定,但也许是问题所在,我的路径实际上有空格,并且看起来像这样: /foo12323/test34 - 343bar/test - 234/test - 4323.txt 抱歉,如果没有引起麻烦,我首先没有提到它。

对于特定的路径管理,您具有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

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

怎么样

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

以下应符合POSIX

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

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

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

或不带-r (使用扩展的正则表达式):

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

回声 awk -F \\ /'{print $ NF}'| grep测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM