【问题标题】:ZSH: Escape or quote a string with backslashesZSH:使用反斜杠转义或引用字符串
【发布时间】:2017-09-07 14:18:49
【问题描述】:

我编写了一个小函数,将 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

【问题讨论】:

    标签: macos zsh oh-my-zsh zshrc


    【解决方案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】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 好吧,如果我愿意,我可以自己将反斜杠更改为正斜杠,但我希望脚本能够完成这项烦人的工作!目标是,仅粘贴我从同事那里获得的使用 Windows 的路径。
        猜你喜欢
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多