Quando você executa > /tmp/foo.txt , sobrescreve os conteúdos de /tmp/foo.txt com a saída de sed 's/old text/new text/' file1.txt . Como /tmp/foo.txt não existe quando você executa este comando, o bash criará esse arquivo para você e então o escreverá.
Em seguida, quando você usar o -p flag para cp , estará copiando as permissões e os atributos de /tmp/foo.txt para file1.txt e sobrescrevendo-o no processo.
Em vez disso, o que você quer fazer é sobrescrever o conteúdo de file1.txt com o conteúdo de /tmp/foo.txt , o que deve soar familiar. Executar
sed 's/old text/new text/' file1.txt > /tmp/foo.txt
cat /tmp/foo.txt > file1.txt
Observe que isso não copia nenhuma permissão ou atributo de file1.txt para /tmp/foo.txt ou vice-versa - você está mantendo os metadados existentes para file1.txt , mas modificando o conteúdo.
Nesta instância específica, você também pode usar apenas sed -i como sugerido pelo pbm.
