假设我有一条如下所示的路径:
/A/B/C/DIRECTORY/D/E/F
现在,我希望使用参数替换实现的是在DIRECTORY之后剪切路径的一部分,无论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实现这个,但我很感兴趣,如果只使用参数替换。
答案 0 :(得分:2)
可能会有所帮助 -
[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
答案 1 :(得分:1)
尝试下一个解决方案:
cd ${CURRENT_DIRECTORY/${DIRECTORY}*/""}
编辑:
更准确的答案是在删除最后一部分后追加您的目录:
cd ${CURRENT_DIRECTORY/${DIRECTORY}*/""}$DIRECTORY
答案 2 :(得分:1)
[ghoti@pc ~]$ D="/A/B/C/foo/D/E"
[ghoti@pc ~]$ echo "${D/foo*/}"
/A/B/C/
当然,这并不完美:
[ghoti@pc ~]$ D="/A/B/C/foobar/D/foo/E"
[ghoti@pc ~]$ echo "${D/foo*/}"
/A/B/C/
阅读bash手册页并搜索“模式替换”。
答案 3 :(得分:0)
感谢Birei,我来到了这里(不完美但很好的解决方案:
#/bin/bash
if [[ $# < 1 ]]
then
echo "Usage: $0 BASENAME"
fi
echo ${PWD/%$1*/$1}
示例:
$ PWD=/home/ltorvalds/workspace
$ ./up.sh ltorvalds
/home/ltorvalds