Seria fácil com qualquer idioma em que as expressões regulares fossem capazes de olhar para trás. Claro, Perl é o primeiro da lista:
perl -pe 's/(?<!John\W)Smith/John/g' <<< "John Smith and Jane Johnson talk about Smith's car."
O ponto fraco é ter mais de um caractere sem palavra entre "John" e "Smith". Infelizmente, um quantificador como +
para \W
aumentaria o erro "Erro de comprimento variável não implementado".