% x=abracadabra
% echo ${x//a/o}
obrocodobro
哼……
有没有办法替代最后的使用 shell 替换出现模式(IOW,不推出sed
、awk
、perl
等)?
答案1
注意:这替换了尾随的出现 - 与“最后一次出现”不太一样
来自Bash 参考手册第 3.5.3 节 Shell 参数扩展 :
${parameter/pattern/string}
该模式被扩展以产生一个模式,就像文件名扩展一样。参数被扩展,并且模式与其值的最长匹配被替换为字符串。如果模式以“/”开头,则模式的所有匹配项都将替换为字符串。通常只替换第一个匹配项。如果模式以“#”开头,则它必须匹配参数扩展值的开头。如果模式以“%”开头,则它必须匹配参数扩展值的末尾。如果字符串为空,则删除模式的匹配项,并且可以省略后面的 / 模式。如果启用了 nocasematch shell 选项(请参阅 The Shoptbuiltin 中对 shopt 的描述),则执行匹配时不考虑字母字符的大小写。如果参数是“@”或“',替换操作依次应用于每个位置参数,扩展是结果列表。如果参数是一个数组变量,下标为“@”或“',替换操作依次应用于数组的每个成员,扩展是结果列表。
所以
$ x=abracadabra
$ echo "${x/%a/o}"
abracadabro
答案2
您可以通过 shell 替换来做到这一点,只是有点棘手。您基本上可以在模式插入替换之前抓取所有内容,而不是在模式之后抓取所有内容。对于您的示例,如下所示:
x=abracadabra
echo "${x%a*}o${x##*a}"
编辑:或者只是按照 Steeldriver 在评论中的建议进行操作。