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

sep*_*ott 5 macos zsh zshrc oh-my-zsh

我编写了一个小函数,将 Windows 路径“转换”为 OSX 路径并在 Finder 中打开它。该函数可以与 bash 完美配合,但不能与 zsh 配合使用(我使用 oh-my-zsh)。

问题是它解析特定的反斜杠组合,例如:\f\a\01\02\03等......

例如,此路径字符串是输入:

"\60_Project\6038_Projekt_Part\05_development\assets\img\facebook"
Run Code Online (Sandbox Code Playgroud)

在翻译函数之后,\f序列(来自img\facebook)被错误地翻译为空格,产生输出:

"/60_Project/6038_Project_Part_developmentssets/img
                                                                                   acebook"
Run Code Online (Sandbox Code Playgroud)

我的目标是只粘贴 Windows 路径,而不必手动更改任何内容。

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

这是我写的代码:

"\60_Project\6038_Projekt_Part\05_development\assets\img\facebook"
Run Code Online (Sandbox Code Playgroud)

用法:

"/60_Project/6038_Project_Part_developmentssets/img
                                                                                   acebook"
Run Code Online (Sandbox Code Playgroud)

结果应该是 Finder 打开:

/Volumes/myvolume/60_Project/6038_Project_Part/05_development/assets/img/facebook
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 3

问题是echo在打印字符串时尝试解释字符串中的转义序列。某些版本会这样做echo;有些人只有在您通过该选项后才会这样做-e;有些打印“-e”作为其输出的一部分;有些做...其他随机的事情。基本上,如果您给出echo包含转义符和/或以“-”开头的内容,则无法知道它会做什么。

选项 1:printf改为使用。它有点复杂,因为您必须给它一个格式字符串以及要打印的实际字符串,但它更可预测。哦,还有双引号变量引用:

function parsewinpath {
  printf '%s\n' "$1" | sed -e 's/\\/\//g'
}
Run Code Online (Sandbox Code Playgroud)

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

function openwinpath {
  echo "Opening..."
  open "/Volumes/myvolume${1//\\//}"
}
Run Code Online (Sandbox Code Playgroud)