Isso ocorre porque o operador de redirecionamento > é chamado antes de qualquer comando e, assim, o seguinte acontece nesta ordem:
-
p.pyestá aberto para escrita, truncando o que estava lá antes -
sedé chamado para executar comandos emp.py, que agora está vazio - A saída (que não é nada) é gravada em
p.py(portanto, ela ainda não contém nada)
Você tem duas opções dependendo de quão portátil você quer que seu código seja:
não portátil
Use a opção GNU sed -i para fazer uma edição no local
portátil
redireciona a saída para um arquivo temporário e, em seguida, move o arquivo temporário sobre o original após a conclusão de sed