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