我是新的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 }
你需要捕捉变量然后处理它。
例如,这将使它:
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//\\//}
回应任何这些的输出,看看他们是如何工作的