Como adiciono texto ao início de um arquivo no Bash?

236

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

    
por user479534 17.02.2011 / 04:21

9 respostas

319
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
    
por 17.02.2011 / 04:34
60

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.

    
por 19.12.2012 / 19:57
27

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 .

    
por 22.04.2013 / 14:47
6

Você pode usar o Vim no modo Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 selecione a primeira linha

  2. i insert

  3. x salvar e fechar

por 11.04.2016 / 02:23
4

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.

    
por 17.02.2011 / 04:26
3

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.

    
por 09.01.2013 / 23:49
2

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
    
por 17.02.2011 / 07:25
0

Você pode usar tee :

echo 'task goes here' | cat - todo.txt | tee todo.txt
    
por 08.07.2014 / 16:16
0

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]
    
por 04.08.2018 / 09:04

Tags