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

ZSH: Escape or quote a string with backslashes

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

问题在于它解析特定的反斜杠组合,例如:\f\a</code>、<code></code> 等。 ..</p> <p>例如,这个路径字符串是输入:</p> <pre><code>"_Project38_Projekt_Part_development\assets\img\facebook"

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

"/60_Project/6038_Project_Part_developmentssets/img
                                                                                   acebook"

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

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

这是我写的代码:

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

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

用法:

openwinpath '_Project38_Project_Part_development\assets\img\facebook'

结果应该是Finder打开:

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

只需用另一个反斜杠转义每个反斜杠即可:

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

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

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

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

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

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

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

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