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

时间:2011-12-19 21:34:43

标签: bash

假设我有一条如下所示的路径:

/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实现这个,但我很感兴趣,如果只使用参数替换。

4 个答案:

答案 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