Bash脚本将Windows路径转换为linux路径

时间:2013-11-15 11:02:22

标签: linux windows bash sed path

我是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 个答案:

答案 0 :(得分:9)

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

例如,这将成为:

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')

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

答案 1 :(得分:3)

sed允许使用替代分隔符,以便不使用/

尝试使用此sed命令:

sed -e 's~\\~/~g' -e 's~J:~/usr~' <<< "$line"

答案 2 :(得分:1)

你甚至不需要使用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中用(//)forwardslash(\\)替换所有(/)反斜杠(转义,/):

${line//\\//}

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

答案 3 :(得分:0)

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

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

如果只需要输出路径,可以注释掉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
}