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 指出的那样,您可以跳过 echo
、sed
和整个混乱,并使用参数扩展来完成这项工作:
function openwinpath {
echo "Opening..."
open "/Volumes/myvolume${1//\//}"
}
我写了一个小函数,"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 指出的那样,您可以跳过 echo
、sed
和整个混乱,并使用参数扩展来完成这项工作:
function openwinpath {
echo "Opening..."
open "/Volumes/myvolume${1//\//}"
}