2017-09-07 68 views
1

字符串我写了一个小功能,即“翻译”一个Windows路径到OSX路径并打开它在Finder中。该功能与bash完美配合,但与zsh无关(我使用的是oh-my-zsh)。ZSH:逃离或引用反斜杠

的问题是,它解析特定反斜线组合像\楼\ A \ 01 \ 02 \ 03 ...

所以像

"\60_Project\6038_Projekt_Part\05_development\assets\img\facebook"

一个字符串变成

"/60_Project/6038_Project_Part_developmentssets/img acebook"

的目标是,到刚刚在我从同事那里得到了一个路径粘贴,即正在使用Windows。而不必手动更改任何东西。

如何使用zsh转义或引用字符串以获得我想要的结果?

这里是我写的代码:

function parsewinpath { 
    echo $1 | sed -e 's/\\/\//g' 
} 

function openwinpath { 
    echo "Opening..." 
    open $(parsewinpath "/Volumes/myvolume$1") 
} 

用法:

openwinpath '\60_Project\6038_Project_Part\05_development\assets\img\facebook' 

结果应该是,将搜索打开:

/Volumes/myvolume/60_Project/6038_Project_Part/05_development/assets/img/facebook 

回答

1

问题是echo试图在打印字符串时解释字符串中的转义序列。某些版本的echo可以做到这一点;有些人只有通过-e选项才能做到这一点;一些打印“-e”作为其输出的一部分;一些做...其他随机的事情。基本上,如果你给echo某些包含逃逸和/或以“ - ”开头的东西,则不知道它会做什么。

方案1:printf代替。这有点复杂,因为你必须给它一个格式字符串以及要打印的实际字符串,但它更可预测。哦,双引号的变量引用:

function parsewinpath { 
    printf '%s\n' "$1" | sed -e 's/\\/\//g' 
} 

选项2:@chepner指出的那样,你可以跳过echosed,整个混乱,并使用参数扩展来完成这项工作:

function openwinpath { 
    echo "Opening..." 
    open "/Volumes/myvolume${1//\\//}" 
} 
+0

谢谢,工作完美! – sepiott

0

只是逃避每个反斜线另一个反斜杠:

openwinpath '\\60_Project\\6038_Project_Part\\05_development\\assets\\img\\facebook'

+0

嗯,如果我那样做,我可以改变反斜线斜线自己,但我想剧本做这个烦人的工作!目标是,只需粘贴到我从同事那里获得的使用Windows的路径中。 – sepiott

2

根本不需要parsewinpath。只需使用参数扩展来用正斜杠替换反斜杠即可。

openwinpath /Volumes/myvolume${1//\\//}