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