字符串替换:所有出现

Ray*_*ews 19 zsh string

一个简单的问题,但我找不到答案。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)

  • @Niing在zsh中,是的,你可以编写诸如“${${var//up/down}//left/right}”之类的内容,它将所有出现的“up”替换为“down”以及所有出现的“left”按“右”。 (2认同)

cha*_*aos 9

这应该可以完成这项工作:

VARIABLE=thethethe
echo ${VARIABLE//the/THE}
THETHETHE
Run Code Online (Sandbox Code Playgroud)


Ray*_*ews 5

Thereyago,它必须很简单:

print -r -- ${1//the/THE}
Run Code Online (Sandbox Code Playgroud)

...双斜线可以做到这一点,你不能用“ :s ”来胡闹

顺便说一句,我确实要感谢现有的“StackExchange”网站。在人们可能提出问题的无数地方中,这些地方是迄今为止最好的——人们不仅几乎总能得到答案,而且这些答案总是具有最高的质量。


Dan*_*man 4

有很多答案,但没有一个是全面的,所以我想添加一个答案来概括所有内容。

小写/大写

如果您尝试将字符串大写,最简单的方法是使用:

> 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)