将Windows路径转换为Linux路径的Bash脚本

7

我是一名新手Shell脚本编写者,尝试完成以下任务:将Windows路径转换为Linux路径并导航到该位置:

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

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

"J:" -> "/usr"

并且

"\" -> "/"

这是我的尝试,但它并没有起作用。如果我使用echo命令,它只会返回一个空白:
function cdwin(){
    line="/usrfem/Projects$1/" | sed 's/\\/\//g' | sed 's/J://'
    cd $line
}

1
两个连续的sed命令,用管道符分隔,通常可以用一个分号分隔的sed命令来完成。例如:在您的情况下,echo "/usrfem/Projects$1/" | sed 's|\|/|g;s/J://' - NeronLeVelu
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')

并将每个\替换为/,将结果保存到变量line中。请注意,它使用另一个分隔符#使其更易读。 它还删除了前导的J:


将替换行更改为 line=$(sed -e 's#^\(.\):#/mnt/\L\1#' -e 's#\\#/#g' <<< "$1"),以便在Windows 10上的WSL/Ubuntu中使用任何驱动器和路径。 - Vijay
当我运行这段代码时,我会收到错误信息“-bash: cd: ~/work/projects: 没有那个文件或目录”,但是如果我手动从命令行运行“cd ~/work/projects”,它就可以工作。你有什么想法我做错了什么吗? - Josh
如何使用cdwin()?我应该将它放在.profile文件中吗?还是需要创建一个同名文件,然后执行chmod +x命令,并将该文件放入我的PATH路径中? - qqqqq

3

sed允许使用替代分隔符,所以最好不要使用/

尝试使用这个sed命令:

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

2

你甚至不需要使用sed(虽然使用sed也没有问题)。这对我来说可以使用bash字符串替换:

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

cdwin 'J:\abc\def'

替换工作如下(简化):

${var/find/replace} 

双斜杠代表替换所有:

${var//findall/replace}

在第一个参数中,用/usr替换第一次出现的J:
${1/J://usr}

在变量line中,将所有(已转义的)反斜杠(\\)替换为(/)正斜杠(/):
${line//\\//}

输出任何一个的echo,以查看它们的工作原理。


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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接