O cat é um desperdício inútil de CPU, elimine-o. Envie a saída em vez de um arquivo temporário e renomeie o arquivo depois:
tr x y < input > input.tmp && mv input.tmp input
Com moreutils instalado, isso pode ser feito com sponge (que faz o arquivo temporário nos bastidores):
tr x y < input | sponge input
Observe que tais renomeações podem destruir os contextos de ACL ou de segurança sofisticados definidos no arquivo input do original agora desvinculado.