7

我是 shell 脚本的新手,并试图完成以下操作,将 windows 路径转换为 ​​linux 路径并导航到该位置:

输入:cdwin "J:\abc\def" 动作:cd /usr/abc/def/

因此,我正在更改以下内容:

"J:" -> "/usr"

"\" -> "/"

这是我的尝试,但它不起作用。如果我回显它,它只会返回一个空白:

function cdwin(){
    line="/usrfem/Projects$1/" | sed 's/\\/\//g' | sed 's/J://'
    cd $line
}
4

4 回答 4

11

您需要捕获变量然后对其进行处理。

例如,这将使它:

function cdwin(){
    echo "I receive the variable --> $1"
    line=$(sed -e 's#^J:##' -e 's#\\#/#g' <<< "$1")
    cd "$line"
}

然后你用

cdwin "J:\abc\def"

解释

命令

line=$(sed -e 's#^J:##' -e 's#\\#/#g' <<< "$1")

相当于

line=$(echo $1 | sed -e 's#^J:##' -e 's#\\#/#g')

并将每个替换\/,将结果保存到 varline中。请注意,它使用另一个分隔符 ,#使其更具可读性。它还删除了前导J:.

于 2013-11-15T11:09:20.513 回答
3

sed 允许替代分隔符,因此最好不要使用/.

试试这个 sed 命令:

sed -e 's~\\~/~g' -e 's~J:~/usr~' <<< "$line"
于 2013-11-15T11:03:50.187 回答
2

您甚至不需要使用 sed(尽管使用 sed 并没有错)。这适用于我使用 bash 字符串替换:

function cdwin() {
  line=${1/J://usr}
  line=${line//\\//}
  cd "$line"
}

cdwin 'J:\abc\def'

替换工作如下(简化):

${var/find/replace} 

双斜杠表示全部替换:

${var//findall/replace}

在参数1中,将第一个实例替换J:/usr

${1/J://usr}

在变量中用 ( )正斜杠 ( )line替换所有 ( //) 反斜杠(转义,):\\//

${line//\\//}

回显其中任何一个的输出以查看它们是如何工作的

于 2017-10-27T13:30:04.540 回答
0

我的代码受到顶帖的启发,但经过修改后可以在 Windows 10 上的任何驱动器上运行,同时在本机 ubuntu(又名 WSL)上运行。

如果您只想要该功能,可以注释掉调试行。

cd如果您只想输出路径,可以注释掉该行

function cdwin() {
    # Converts Windows paths to WSL/Ubuntu paths, prefixing /mnt/driveletter and preserving case of the rest of the arguments,
    # replacing backslashed with forwardslashes
    # example: 
    # Input -> "J:\Share"
    # Output -> "/mnt/j/Share"
    echo "Input --> $1" #for debugging
    line=$(sed -e 's#^\(.\):#/mnt/\L\1#' -e 's#\\#/#g' <<< "$1")
    #Group the first character at the beginning of the string. e.g. "J:\Share", select "J" by using () but match only if it has colon as the second character
    #replace J: with /mnt/j
    #\L = lowercase , \1 = first group (of single letter)
    # 2nd part of expression
    #replaces every \ with /, saving the result into the var line. 
    #Note it uses another delimiter, #, to make it more readable.
    echo "Output --> $line" #for debugging
    cd "$line" #change to that directory
}
于 2018-09-18T16:21:43.140 回答