I have tried this with all the anchor symbols I can think of.
Não são as âncoras, mas o fato de você ter um jogo ganancioso com o asterisco. A expressão \(.*\)o corresponde a o mais que uma string , por isso
ele vai comer tudo até o último o . Pode coincidir com os anteriores o também.
Mas, então, capturar algo e devolvê-lo de volta é inútil, basta remover o \(.*\) e o completamente.
Então, isso (pelo menos no GNU sed) remove o no final das palavras:
sed 's/o\>//g'
sed 's/o\b//g'
Isso, é claro, apenas no final da string:
sed 's/o$//g'
E isso removerá um o , juntamente com um caractere não relacionado a palavras (por exemplo, o espaço após Hello ):
sed 's/o\W//g'
Se o seu sed não suportar \< / \> ou \b , você terá que fazer outra coisa. Isso corresponderia a o seguido por um caractere não alfanumérico ou o fim da linha:
$ echo "jello, jello" | sed -E -e 's/o([^[:alnum:]]|$)//g'
jell, jell
Isso funciona, por exemplo no sed que vem com o OS X / macOS.
As expressões regulares de Perl suportam a adição de um ponto de interrogação a * ou + para torná-las não-vorazes. Em seguida, eles corresponderiam à sequência mais mais curta possível:
echo "jello, jello" | perl -pe 's/(.*?)o/$1/g'
jell, jell