ZSH:使用反斜杠转义或引用字符串

时间:2017-09-07 14:18:50

标签: macos zsh oh-my-zsh zshrc

我写了一个小功能,"翻译" OSX路径的Windows路径,并在Finder中打开它。该功能与bash完美配合,但不适用于zsh(我使用oh-my-zsh)。

问题是,它解析特定的反斜杠组合,如\ f,\ 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'

结果应该是,Finder打开:

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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//\\//}"
}

答案 2 :(得分:0)

用另一个反斜杠逃避每个反斜杠:

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