Oi eu quero prefixar o texto em um arquivo. Por exemplo, quero adicionar tarefas ao início de um arquivo todo.txt. Estou ciente echo 'task goes here' >> todo.txt
mas isso adiciona a linha ao final do arquivo (não o que eu quero).
Oi eu quero prefixar o texto em um arquivo. Por exemplo, quero adicionar tarefas ao início de um arquivo todo.txt. Estou ciente echo 'task goes here' >> todo.txt
mas isso adiciona a linha ao final do arquivo (não o que eu quero).
Respostas:
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
|
) a mensagem ( echo '...'
) para cat
que usa -
(entrada padrão) como o primeiro arquivo e todo.txt
como o segundo. cat
CONCATENA vários arquivos. Envie a saída ( >
) para um arquivo chamado temp
. Se não houver erros ( &&
) de cat
depois renomeie mv
) a temp
arquivo de volta para o arquivo original ( todo.txt
).
1
significa fazer o próximo comando apenas na linha um do arquivo e o i
comando é inserir. Procure na página man sob a seção "Addresses" e na seção "Zero-or One-address commands".
sed
comando é algo como isto (inserindo uma guia principal): '1i\tSome Text'
, você pode precisar dobrar a barra invertida. Caso contrário, seu dialeto de sed
pode não reconhecer \t
como guia.
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 todo.txt
é 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 ideia se houver alguma barra invertida todo.txt
porque graças ao -e
O eco da bandeira irá interpretá-los. 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 única, mas realisticamente 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 alternativas 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 use isso. Bem, exceto o penúltimo. Isso não atrapalha no final.
-e
também converter seqüências de escape dentro todo.txt?
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 ter moreutils
com muitas distribuições do Linux, apt-get install moreutils
, ou no OS X usando Homebrew com brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
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
inserir
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.
new_todo.txt
fica escrito apenas parcialmente. Sua solução parece perder o arquivo original.
rm
do arquivo original.
Se o arquivo de texto for pequeno o suficiente para caber na memória, você não precisará criar um arquivo temporário para substituí-lo. Você pode carregar tudo na memória e escrevê-lo de volta no arquivo.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
É impossível adicionar linhas ao início do arquivo sem gravar o arquivo inteiro.
text=$(cat file)
. Tenha cuidado para usar apenas o texto, porque as variáveis do shell não são binárias mywiki.wooledge.org/BashFAQ/058
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, então, requer que um arquivo temporário (ou buffer) seja criado (na memória ou no disco), o que acabará substituindo o arquivo original.
Cuidado para não perder dados preservando o arquivo original enquanto cria 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
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
funciona mas cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
dá o erro "echo: Nenhum tal arquivo ou diretório"
<
e a (
iria quebrar a sintaxe. Experimentar cat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Você pode usar tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
Git Bash + Windows10 + Multilinha :
Aqui está uma versão que permite usar seqüê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]