参数替换 - 模式后删除字符串的一部分

问题描述:

比方说,我有一个类似如下的路径:参数替换 - 模式后删除字符串的一部分

/A/B/C/DIRECTORY/D/E/F 

现在,我想用参数替换来实现的东西,被切割的部分DIRECTORY之后的路径,无论路径位于何处(A,B,C等仅代表随机目录名称)。

置换后:

/A/B/C/DIRECTORY 

这是我到目前为止已经试过:

#!/bin/bash 

if [[ $# < 1 ]] 
then 
    echo "Usage: $0 DIRECTORY" 
fi 

CURRENT_DIRECTORY=$(pwd) 
DIRECTORY=$1 

cd ${CURRENT_DIRECTORY%!(DIRECTORY)/*} 

显然,这是行不通的。我可以使用awk或sed实现这一点,但我很感兴趣的是,如果可能只使用参数替换。

尝试下一个解决方案:

cd ${CURRENT_DIRECTORY/${DIRECTORY}*/""} 

编辑:

更准确的答案将除最后一部分后追加目录:

cd ${CURRENT_DIRECTORY/${DIRECTORY}*/""}$DIRECTORY 

[[email protected] ~]$ D="/A/B/C/foo/D/E" 
[[email protected] ~]$ echo "${D/foo*/}" 
/A/B/C/ 

当然,这ISN” t完美:

[[email protected] ~]$ D="/A/B/C/foobar/D/foo/E" 
[[email protected] ~]$ echo "${D/foo*/}" 
/A/B/C/ 

阅读bash手册页并搜索“模式替换”。

可能这可以帮助 -

[jaypal:~/Temp] D="A/B/C/DIRECTORY/D/E/F" 

[jaypal:~/Temp] echo $D 
A/B/C/DIRECTORY/D/E/F 

[jaypal:~/Temp] c=${D%/*/*/*} 

[jaypal:~/Temp] echo $c 
A/B/C/DIRECTORY 

感谢Birei,我来到这个(并不完美,但足够好的解决方案:

#/bin/bash 

if [[ $# < 1 ]] 
then 
    echo "Usage: $0 BASENAME" 
fi 

echo ${PWD/%$1*/$1} 

例子:

$ PWD=/home/ltorvalds/workspace 
$ ./up.sh ltorvalds 
/home/ltorvalds