一个简单的问题,但我找不到答案。zsh 文档让我不知所措:-(
function z ()
{
echo ${1:s/the/THE}
}
$ z thethethe
THEthethe
Run Code Online (Sandbox Code Playgroud)
...
如何将所有“the”替换为“THE”,而不仅仅是第一次出现?使用 zsh,它是最简单的事情,但似乎最难找到示例。
Gil*_*il' 28
这是一个历史扩展修饰符,所以在g
之前添加修饰符s
。
echo ${1:gs/the/THE}
Run Code Online (Sandbox Code Playgroud)
或者,使用参数扩展语法,其中双斜杠表示全局替换。在这种情况下,后面的部分s//
是通配符模式,而历史扩展替换采用文字字符串。
echo ${1//the/THE}
Run Code Online (Sandbox Code Playgroud)
这应该可以完成这项工作:
VARIABLE=thethethe
echo ${VARIABLE//the/THE}
THETHETHE
Run Code Online (Sandbox Code Playgroud)
Thereyago,它必须很简单:
print -r -- ${1//the/THE}
Run Code Online (Sandbox Code Playgroud)
...双斜线可以做到这一点,你不能用“ :s ”来胡闹
顺便说一句,我确实要感谢现有的“StackExchange”网站。在人们可能提出问题的无数地方中,这些地方是迄今为止最好的——人们不仅几乎总能得到答案,而且这些答案总是具有最高的质量。
有很多答案,但没有一个是全面的,所以我想添加一个答案来概括所有内容。
如果您尝试将字符串大写,最简单的方法是使用:
> str="thethethe"
> upper="$str:u"
> echo $upper
THETHETHE
Run Code Online (Sandbox Code Playgroud)
(不是原始问题的一部分,但以防万一)如果您尝试小写,则同样适用:l
。
如果您想替换单个出现的内容,请使用以下命令:
> str="thethethe"
> echo ${str/the/man}
manthethe
Run Code Online (Sandbox Code Playgroud)
如果在变量和要替换的测试之间添加额外的斜杠,它将替换所有出现的情况:
> str="thethethe"
> echo ${str//the/man}
manmanman
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用历史修饰符,就像吉尔斯建议的那样:
> str="thethethe"
> echo ${str:gs/the/man}
manmanman
Run Code Online (Sandbox Code Playgroud)