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.txtporque 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]