有没有办法使用 shell 变量替换来替换最后一次出现的匹配项?

有没有办法使用 shell 变量替换来替换最后一次出现的匹配项?
% x=abracadabra
% echo ${x//a/o}
obrocodobro

哼……

有没有办法替代最后的使用 shell 替换出现模式(IOW,不推出sedawkperl等)?

答案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 在评论中的建议进行操作。

相关内容