Bash脚本将Windowspath转换为Linuxpath

我是新的shell脚本,并试图完成以下操作,将Windowspath转换为Linuxpath和导航到该位置:

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

所以,我正在改变以下内容:

 "J:" -> "/usr" 

 "\" -> "/" 

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

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

Solutions Collecting From Web of "Bash脚本将Windowspath转换为Linuxpath"

你需要捕捉变量然后处理它。

例如,这将使它:

 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: :。

sed允许使用不同的分隔符,以免使用/

试试这个sed命令:

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

你甚至不需要使用sed(虽然使用sed没有任何错误)。 这对我使用bash字符串替换:

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

cdwin 'J:\abc\def'

替补的工作如下(简化):

 ${var/find/replace} 

双斜杠意味着全部替换:

 ${var//findall/replace} 

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

 ${1/J://usr} 

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

 ${line//\\//} 

回应任何这些的输出,看看他们是如何工作的