4

我正在寻找运行pwd,如果内容包括“/Volumes/Storage/Users/testuser/”,则重定向到 ~/,然后是其余内容pwd。例如,如果 pwd 返回:

/Volumes/Storage/Users/testuser/Desktop/folder1/folder2/

这个 bash 脚本会 cd 到:

~/Desktop/folder1/folder2/

到目前为止我所拥有的是这个,但我似乎无法让匹配组正确显示:

[[ $(pwd) =~ \/Volumes\/Storage\/Users\/testuser\/(.*) ]] && cd "~/${BASH_REMATCH[1]}"
4

4 回答 4

2

波浪号不能被引用,否则cd会看到一个文字~字符。

cd ~/"${BASH_REMATCH[1]}"

你也不需要逃避斜线,因为它的价值。

于 2013-07-26T16:27:46.143 回答
1

您不应该逃避正则表达式中的斜杠。

此外,~正如 John Kugelman 所提到的,在字符串中将无法正常工作。

if [[ $(pwd) =~ /Volumes/Storage/Users/testuser/(.*) ]]; then
    cd "$HOME/${BASH_REMATCH[1]}"
fi
于 2013-07-26T16:42:41.163 回答
1

也许您对替代解决方案感兴趣。

我建议以下使用 shell 参数扩展。

PREFIX="/Volumes/Storage/Users/testuser/"
PWD=`pwd`

[[ ${PWD} =~ ${PREFIX}* ]] && cd ~/"${PWD#${PREFIX}}"

表格在开头${PWD#${PREFIX}}删除。${PREFIX}${PWD}

于 2013-07-26T16:55:33.360 回答
0

你想做什么?

如果用户尝试到cd并且/Volumes/Storage/Users/testuser/Desktop/folder1/folder2/他们的 HOME 目录是/home/bob,他们应该cd改为/home/bob/Desktop/folder1/folder2吗?

如果/home/bob/Desktop/folder1/folder2不存在怎么办?

这是一个替换cd为您正在 CD 的目录的函数。别名_cdcd,你都准备好了。

如果您不使用cd命令,则可以在其他 shell 脚本中完成相同的基本操作。

我正在使用${parameter#word}语法来删除$BAD_DIR前缀。我使用 glob 匹配来查看目录是否有错误目录作为前缀。

然后我HOME_DIR=~用来设置我真正的 HOME 目录。我不知道如果用户$HOME改变~或不改变会发生什么。但是,这允许我在目录名称中使用引号。

我可能应该检查$PWD以确保它们不在那里,并验证这是相对cd还是给出完整路径的相对。但是,这很容易添加。这应该足以让您继续前进。

function _cd {
    cd_to_dir="$1"
    BAD_DIR="/Volumes/Storage/Users/testuser"
    if [[ $cd_to_dir = $BAD_DIR* ]]
    then
        HOME_DIR=~
        cd_to_dir="$HOME_DIR/${cd_to_dir#${BAD_DIR}}"
    fi
    \cd "$cd_to_dir"
}

alias cd=_cd

这适用于我的电脑。我有 BASH,但我也设置extglob了一些其他的东西。这应该在没有extglob设置的情况下工作,但如果它不添加这些行:

function _cd {
    cd_to_dir="$1"
    BAD_DIR="/Volumes/Storage/Users/testuser"
    is_extglob_set=$(shopt -q extglob)
    [ $is_extglob_set ] || shopt -s extglob
    if [[ $cd_to_dir = $BAD_DIR* ]]
    then
        HOME_DIR=~
        cd_to_dir="$HOME_DIR/${cd_to_dir#${BAD_DIR}}"
    fi
    [ $is_extglob_set ] || shopt -u extglob
    \cd $cd_to_dir
}

alias cd=_cd
于 2013-07-26T17:12:06.047 回答