Por que o 'cat'ing de um arquivo em si mesmo o apaga? [duplicado]

9

Eu só queria remover todos, exceto a primeira linha de um arquivo. Eu fiz isso:

head -1 foo.txt

... e verifiquei que só vi a primeira linha. Então eu fiz:

head -1 foo.txt > foo.txt

Mas, em vez de conter apenas a primeira linha, foo.txt estava agora vazio.

Acontece que cat foo.txt > foo.txt também esvazia o arquivo.

Por quê?

    
por Nathan Long 20.06.2012 / 19:42

2 respostas

11

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).

    
por 20.06.2012 / 19:47
2

Como o shell que você usa para invocar cat , o redirecionamento é indicado por > .

O shell (bash, zsh, ksh, dash, qualquer que seja) lê o comando cat foo.txt > foo.txt . O shell precisa configurar o redirecionamento indicado por > foo.txt . > significa começar a escrever o arquivo a partir do topo, >> significaria anexar ao foot.txt.

No momento em que o shell realmente obtiver cat em execução, o foo.txt desapareceu.

    
por 20.06.2012 / 19:47

Tags