2011-02-17 03:21:12 +0000 2011-02-17 03:21:12 +0000
306
306

Como posso adicionar texto ao início de um ficheiro em Bash?

Olá, quero pré-fixar texto a um ficheiro. Por exemplo, quero adicionar tarefas ao início de um ficheiro todo.txt. Estou ciente do echo 'task goes here' >> todo.txt mas isso adiciona a linha ao fim do ficheiro (não ao que eu quero).

Respostas (9)

396
396
396
2011-02-17 03:34:10 +0000
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
81
81
81
2012-12-19 18:57:40 +0000

Uma opção mais simples na minha opinião é :

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

Isto funciona porque o comando dentro de $(...) é executado antes de todo.txt ser substituído por > todo.txt

Enquanto as outras respostas funcionam bem, eu acho isto muito mais fácil de lembrar porque eu uso echo e cat todos os dias.

EDIT: Esta solução é uma péssima ideia se houver alguma barra invertida em todo.txt, porque graças ao -e flag echo irá interpretá-las. Outra forma, muito mais fácil de introduzir novas linhas no prefácio é…

echo "task goes here
$(cat todo.txt)" > todo.txt

…simplesmente para usar novas linhas. Claro, já não é uma linha única, mas também já não era, realisticamente, uma linha única. Se está a fazer isto dentro de um script, e está preocupado com a indentação (por exemplo, está a executar isto dentro de uma função), existem algumas soluções para fazer com que isto 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

Também, se se preocupa se uma nova linha é adicionada ao final do todo.txt, não a utilize. Bem, excepto a penúltima. Isso não mexe com o final.

28
28
28
2013-04-22 12:47:19 +0000

O moreutils tem uma boa ferramenta chamada sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

Vai “absorver” o STDIN e depois escrever no ficheiro, o que significa que não tem de se preocupar com ficheiros temporários e movê-los.

Pode obter o moreutils com muitas distros Linux, através do apt-get install moreutils, ou no OS X usando o Homebrew , com o brew install moreutils.

12
12
12
2016-04-11 00:23:56 +0000

Pode utilizar a Vim em modo Ex:

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

  2. i inserir

  3. x guardar e fechar

5
5
5
2011-02-17 03:26:24 +0000

Pode criar um novo ficheiro temporário.

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

Também pode utilizar sed ou awk. Mas basicamente a mesma coisa acontece.

3
3
3
2011-02-17 06:25:01 +0000

Não é possível inserir conteúdo no início de um ficheiro. A única coisa que pode fazer é substituir o conteúdo existente ou anexar bytes após o fim do ficheiro actual.

Qualquer solução para a sua questão requer a criação de um ficheiro temporário (ou buffer) (na memória ou no disco) que eventualmente substituirá o ficheiro original.

Cuidado para não perder dados preservando o ficheiro original enquanto cria o novo, caso o sistema de ficheiros esteja cheio durante o processo. ex:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3
3
3
2013-01-09 22:49:33 +0000

Se o ficheiro de texto for suficientemente pequeno para caber na memória, não tem de criar um ficheiro temporário para o substituir. Pode carregá-lo todo na memória e escrevê-lo novamente no ficheiro.

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

É impossível adicionar linhas ao início do ficheiro sem escrever demasiado o ficheiro inteiro.

1
1
1
2014-07-08 14:16:36 +0000

Pode utilizar tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt
0
0
0
2018-08-04 07:04:48 +0000

GitBash* + Windows10* + Multline :

Aqui está uma versão que lhe permite utilizar multi-line strings.

##############################################
## 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]