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.