Antes que o shell inicie o processamento de quaisquer dados, ele precisa ter certeza de que todas as entradas e saídas estão alinhadas.
Portanto, no seu caso, usar > foo.txt basicamente diz ao sistema: "crie um (novo) arquivo chamado foo.txt e coloque toda a saída desse comando nesse arquivo".
O problema é que, como você descobriu, isso elimina o conteúdo anterior.
Relacionado, >> será anexado a um arquivo existente.
Atualizar :
Aqui está uma solução usando sed , manuseie com cuidado:
sed -i '2,$d' foo.txt
Ele excluirá as linhas 2 para "last" no local no arquivo foo.txt . É melhor tentar isso em um arquivo que você pode perder primeiro:)
Esta versão ligeiramente modificada do comando manterá uma cópia do original com a extensão .bak :
sed -i.bak '2,$d' foo.txt
Você pode especificar qualquer seqüência de caracteres (ou um único caractere) após a alteração da linha de comando -i para o nome do arquivo "backup" (ou seja, original).