Como faço para anexar texto a um arquivo?


109

Qual é a maneira mais fácil de anexar texto a um arquivo no Linux?

Eu dei uma olhada nesta pergunta , mas a resposta aceita usa um programa adicional ( sed) Tenho certeza de que deveria haver uma maneira mais fácil com echoou semelhante.

Respostas:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Basicamente, você pode despejar qualquer texto que desejar no arquivo. CTRL-D envia um sinal de fim de arquivo, que termina a entrada e retorna ao shell.


2
Como posso fazer isso quando o arquivo precisa de permissão de root?
— UselesssCat

2
@UselesssCat quando algo passa "permissão negada", eu verifico novamente qualquer comando que estou executando e uso sudo !!- que executa o último comando com sudoprefixado. Recentemente descobri que isso também funciona com nanoetc (acidentalmente tentando nano nano auth...)
— Sandra

se você precisar usar sudo ou usar isso em um script, consulte meu acompanhamento para esta resposta aceita abaixo.
— user12345

4
Eu não sabia que um gato poderia ser usado assim! É como escrever um diário. Também não sabia sobre o que ctrl-d faz. Obrigado!
— houallet de

1
@Sandra - Não usei !!antes, demais. Freqüentemente eu faço coisas como cat /var/log/apache/error.loge tenho permissão negada. Isso também pode ser feito com um id do histórico sudo !1419, por exemplo , isso executará o comando na linha 1419do histórico como sudo.
— Cyclonecode de

172

E se:

echo "hello" >> <filename>

Usando o >> operador irá anexar dados no final do arquivo, enquanto o uso do >irá sobrescrever o conteúdo do arquivo se já existir.

Você também pode usar printfda mesma maneira:

printf "hello" >> <filename>

Observe que pode ser perigoso usar o acima. Por exemplo, se você já tiver um arquivo e precisar acrescentar dados ao final do arquivo e se esquecer de adicionar por último, >todos os dados do arquivo serão destruídos. Você pode alterar esse comportamento definindo a noclobbervariável em .bashrc:

set -o noclobber

Agora, quando você tentar fazer echo "hello" > file.txt, receberá um aviso dizendo cannot overwrite existing file.

Para forçar a gravação no arquivo, você deve usar a sintaxe especial:

echo "hello" >| <filename>

Você também deve saber que, por padrão, echoadiciona um caractere de nova linha à direita que pode ser suprimido usando o -nsinalizador:

echo -n "hello" >> <filename>

Referências


4
Em geral, gosto mais disso do que da resposta aceita que usa cat, mas é melhor você ter cuidado ao usar em >>vez de >!
— sixty4bit de

@ sixty4bit - Concordo totalmente, mas acho que você sempre deve saber o que está fazendo ao trabalhar com um shell ou então você pode fazer algo como sudo rm -r /=)
— Cyclonecode

1
melhor do sudo rm -r /que sudo rm -rf /! ^ _ ^ Existe um sinalizador que pede confirmação antes de substituir o conteúdo de um arquivo existente com >? Aliasing que usar sempre esse sinalizador parece que seria uma boa ideia.
— sessenta4 bits de

2
@ sixty4bit - Você pode adicionar set -o noclobberem seu .bashrcentão você não pode sobrescrever um arquivo existente sem usar a sintaxe especialecho "hello" >| <filename>
— Cyclonecode

você pode dar um exemplo onde o arquivo é chamado, digamos "meuArquivo.txt" ou algo assim? Não tenho certeza se é <filename> ou nome do arquivo no seu exemplo
— bharal

24

Outra maneira possível é:

echo "text" | tee -a filename >/dev/null

o -a será anexado no final do arquivo.

Se precisar sudo, use:

echo "text" | sudo tee -a filename >/dev/null

Por que o> / dev / null no final?
— Quadrivium

1
O >/dev/nullno final evita que "texto" seja mostrado em seu console.
— user9869932

13

Acompanhamento para resposta aceita.

Você precisa de algo diferente de CTRL-D para designar o fim, se estiver usando isso em um script . Em vez disso, tente isto:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Isso acrescentará texto ao arquivo declarado (não incluindo "EOF").

Ele utiliza um documento here (ou heredoc) .

No entanto, se você precisar que o sudo seja anexado ao arquivo indicado, terá problemas ao utilizar um heredoc devido ao redirecionamento de E / S se estiver digitando diretamente na linha de comando.

Esta variação funcionará quando você estiver digitando diretamente na linha de comando:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Ou você pode usar, em teevez disso, para evitar o problema de sudo da linha de comando visto ao usar o heredoc com cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

Eu uso cat << 'EOF' >há anos e não sabia sobre cat << 'EOF' >>como acrescentar! Obrigado
— FreeSoftwareServers
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.