Estou escrevendo um script bash para procurar um arquivo, se ele não existir, crie-o e acrescente-o:
Host localhost
ForwardAgent yes
Então "line then new line 'tab' then text"
eu acho que é um formato sensível. Eu sei que você pode fazer isso:
cat temp.txt >> data.txt
Mas parece estranho desde suas duas linhas. Existe uma maneira de acrescentar isso neste formato:
echo "hello" >> greetings.txt
shell
text-processing
io-redirection
A lenda
fonte
fonte
( echo "line 1" ; echo "line 2" ) >>greetings.txt
.{ echo "line 1" ; echo "line 2"; } >>greetings.txt
cat <<EOT
oEOT
é apenas uma seqüência aleatória. Poderia sercat <<FOO
também.Ou, se você deseja uma guia literal (em vez dos quatro espaços da sua pergunta):
Você pode obter o mesmo efeito com
echo
, mas exatamente como varia de implementação para implementação, enquantoprintf
é constante.fonte
fonte
Outra abordagem é usar
tee
Algumas linhas de escolha da
tee
página do manual:fonte
O SED pode anexar uma linha ao final de um arquivo da seguinte forma:
sed -i '$ a text to be inserted' fileName.file
$
seleciona o final do arquivo, oa
diz para anexar e, depois disso, vem o texto a ser inserido. Então, é claro, o nome do arquivo.Fonte: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html
========== EDIT == ==========
Essa abordagem tem algum benefício adicional do que outras soluções?
Sim, essa abordagem tem o benefício adicional de anexar a qualquer arquivo retornado em uma pesquisa, como esta:
find . -name "*.html" -exec sed -i '$ a </html>' {} \;
Usei o exemplo acima para inserir a tag html final que faltava em todas as páginas html em vários diretórios.
===================================
fonte
sed
. BSDsed
afiança com o erro:command a expects \ followed by text
. Portanto, não use isso para uma solução com script; é susceptível de quebrar. (Ou fazê-lo corretamente como o BSD exigido sintaxe é POSIX compatível e vai trabalhar em GNUsed
também.find
o seguinte:find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
.>
,>>
) e, portanto, não sofre de problemas como execuçãosudo echo 'something' > /file
. Para mim é perfeitamente permite anexar uma linha em um arquivo no recipiente LXD assim:lxc exec c sed -- '$ a newline' /myfile
.echo "a new line" >> foo.file
não criará uma nova linha quando o arquivo não estiver no final da nova linha, mas osed -i '$ a a new line' foo.file
fará, entãosed
é melhor, especialmente se você quiser sempre acrescentar uma nova linha ao arquivo.Eu usei o sed porque ele pode ser usado com o sudo. Por exemplo:
a alternativa é muito feia como:
e ainda mais feio quando feito com ssh.
fonte
sed -i
não usa uma extensão como argumento? Seu exemplo pode ter parâmetros incorretos.Outro liner é:
Eu preferiria a
-e
opção pensada, pois oferece mais controle:fonte
Pode-se emular
cat >> out.txt
com Perl ou Python para obter o mesmo efeito. Perl:E Python:
Observe que, para python, você terá que pressionar Ctrl+ Dduas vezes. Consulte a pergunta relacionada no stackoverflow para obter mais informações.
fonte
Aqui está um exemplo para anexar várias linhas em um arquivo:
fonte
Além da resposta principal, caso o arquivo precise de permissões de superusuário, apenas adicionar
sudo
na frenteecho
não funcionará.Isso ocorre porque o shell quebra os comandos e, embora
echo
tenha sido executado como root, mas>>
executado com privilégios normais.Isso funcionará para o superusuário:
sudo su -c "echo 'Line 3' >> greetings.txt"
fonte
su
aqui (sudo su
não é bom). Mas você está certo de que precisa de algo para gerenciar o redirecionamento do shell; talvezsudo sh -c "echo stuff >> file.txt"
. Sem economia de rede, mas uma prática melhor.