单一替换很简单:
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
当然,诸如tr
、sed
、等外部工具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
更加灵活的命令进行结帐。