O problema é que você está usando redirecionamentos de shell para ler e gravar no mesmo arquivo. Verifique p depois, estará vazio também. O shell o abre no modo de leitura, truncando o arquivo, enquanto ele está configurando o pipeline antes de executar os comandos. No entanto, usar tee , já que ele abre o próprio arquivo, significa que o arquivo não será truncado até que o conteúdo seja lido para a entrada. Esse é um comportamento bem conhecido e documentado e o motivo pelo qual você não pode simplesmente usar redirecionamentos para fazer alterações em linha nos arquivos.