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

5
我写了一个小函数,可以将Windows路径“转换”为OSX路径并在Finder中打开。该函数在bash下完美运行,但在zsh(我使用oh-my-zsh)下无法正常工作。
问题在于它解析特定的反斜杠组合,例如:\f,\a,\01,\02,\03等。
例如,这个路径字符串是输入:
"\60_Project\6038_Projekt_Part\05_development\assets\img\facebook"

在翻译功能之后,\f序列(来自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
4个回答

4
你根本不需要使用parsewinpath。只需使用参数扩展来将反斜杠替换为正斜杠即可。
openwinpath /Volumes/myvolume${1//\\//}

3
问题在于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

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

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


如果我这样做的话,我可以自己将反斜杠改为正斜杠,但我希望脚本能够完成这个烦人的工作!目标是只需粘贴来自使用Windows的同事的路径即可。 - sepiott

0

抱歉,我知道我晚了5年,但我认为解释问题的根源和解决方法可能对其他人有价值:

Bash有一定的语法。它以一定的方式解释反斜杠。因此,您无法将带有反斜杠的文本粘贴到终端中。

但是,如果您已将文本复制到剪贴板中,则可以使用shell命令在脚本内部读取剪贴板来规避bash的语法。因此,不要使用$1从脚本参数中获取路径,而是使用pbpaste直接读取剪贴板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接