是否可以使用 shell 字符串进行双重替换?

是否可以使用 shell 字符串进行双重替换?

单一替换很简单:

string="Mark Shuttleworth"
echo ${string/a/o}

Mork Shuttleworth

但是可以同时做两遍吗?

echo ${string/a/o string/t/g} #doesn't work, but you get the idea

Mork Shuggleworgh

如果可以使用正则表达式,它就足以作为答案。

谢谢

答案1

据我所知,在当前版本中,唯一的方法bash是分两步,例如

$ string="Mark Shuttleworth"
$ string="${string//a/o}"; echo "${string//t/g}"
Mork Shuggleworgh

尝试嵌套替换会导致错误:

$ echo "${${string//a/o}//t/g}"
bash: ${${string//a/o}//t/g}: bad substitution

请注意其他 shell 可能支持此类嵌套替换例如zsh 5.2

~ % string="Mark Shuttleworth"
~ % echo "${${string//a/o}//t/g}"
Mork Shuggleworgh

当然,诸如trsed、等外部工具perl也可以轻松实现

$ sed 'y/at/og/' <<< "$string"
Mork Shuggleworgh

$ perl -pe 'tr /at/og/' <<< "$string"
Mork Shuggleworgh

$ tr at og <<< "$string"
Mork Shuggleworgh

答案2

您要替换单个字母,因此只需使用tr

tr at og

这将导致 eacha被 替换o, eacht被 替换g。使用您的示例:

ek@Io:~$ tr at og <<<'Mark Shuttleworth'
Mork Shuggleworgh

答案3

尝试

echo ${string/a/o} ${string/t/g}

我正在使用平板电脑,无需bash测试。

您可能希望使用printf更加灵活的命令进行结帐。

相关内容