echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
ou
sed -i '1s/^/task goes here\n/' todo.txt
ou
sed -i '1itask goes here' todo.txt
Oi eu quero prefixar o texto em um arquivo. Por exemplo, quero adicionar tarefas ao início de um arquivo todo.txt. Estou ciente de echo 'task goes here' >> todo.txt
, mas adiciona a linha ao final do arquivo (não o que eu quero).
Uma opção mais simples na minha opinião é:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Isso funciona porque o comando dentro de $(...)
é executado antes de todo.txt
ser sobrescrito com > todo.txt
Enquanto as outras respostas funcionam bem, acho isso muito mais fácil de lembrar, porque eu uso eco e gato todos os dias.
EDITAR: Esta solução é uma péssima idéia se houver barras invertidas em todo.txt
, porque graças ao -e
flag eco as interpretará. Outra maneira muito mais fácil de obter novas linhas na string de prefácio é ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... simplesmente para usar novas linhas. Claro, não é mais uma linha de uma linha, mas, na verdade, também não era uma linha direta. Se você estiver fazendo isso dentro de um script e estiver preocupado com o recuo (por exemplo, se estiver executando isso dentro de uma função), há algumas soluções para que isso ainda se ajuste bem, incluindo, mas não se limitando a:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Além disso, se você se importa se uma nova linha é adicionada ao final de todo.txt
, não as use. Bem, exceto o penúltimo. Isso não atrapalha com o final.
O moreutils
tem uma boa ferramenta chamada sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
Ele "absorverá" STDIN e, em seguida, gravará no arquivo, o que significa que você não precisa se preocupar com arquivos temporários e movê-los.
Você pode obter moreutils
com muitas distribuições do Linux, através de apt-get install moreutils
, ou no OS X usando Homebrew , com brew install moreutils
.
Você pode usar o Vim no modo Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
selecione a primeira linha
i
insert
x
salvar e fechar
Você pode criar um novo arquivo temporário.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Você também pode usar sed
ou awk
. Mas basicamente a mesma coisa acontece.
Se o arquivo de texto for pequeno o suficiente para caber na memória, não será necessário criar um arquivo temporário para substituí-lo. Você pode carregar tudo na memória e escrever de volta no arquivo.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
É impossível adicionar linhas ao início do arquivo sem precisar gravar o arquivo inteiro.
Você não pode inserir conteúdo no início de um arquivo. A única coisa que você pode fazer é substituir o conteúdo existente ou anexar bytes após o término atual do arquivo.
Qualquer solução para sua pergunta requer que um arquivo temporário (ou buffer) seja criado (na memória ou no disco), o que eventualmente substituirá o arquivo original.
Cuidado com a não perda de dados preservando o arquivo original ao criar o novo, caso o sistema de arquivos esteja cheio durante o processo. por exemplo:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
Você pode usar tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Aqui está uma versão que permite usar sequências de várias linhas .
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]
Tags bash