Como insiro uma linha na parte superior de um arquivo de texto usando a linha de comando?

25

Quero inserir texto na parte superior de um arquivo já existente. Como posso conseguir isso. Eu tentei echoe teenão obtive sucesso.

Eu estava tentando inserir uma linha de repo na parte superior do sources.listarquivo do terminal.

Nota

Eu preciso de uma solução rápida de uma linha, porque o método de outra resposta já me era conhecido

Anwar
fonte
1
tee adiciona uma linha na parte inferior do arquivo, por exemplo echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- você também precisa do sudo before tee para obter privilégios de administrador. Mas por que diabos você gostaria de adicionar algo no topo do sources.list?
Savvas Radevic
2
@medigeek: em algum lugar na história pergunta do OP você vai encontrar algo sobre a instalação / atualização a partir de um CD-repo ... Eu suspeito que pode ser a razão ...
ish
Obrigado @izx, Sua suposição está correta. Estou quieto impressionado. Você também pode responder a essa pergunta. Tratava-se de instalar a partir de um repositório local usando o centro de software e também definir meu repositório local para a maior prioridade sem colocá-lo no topo. Obrigado novamente.
Anwar
1
@izx, Aqui está o link sobre como definir a prioridade mais alta para o meu repositório local. Ficarei feliz se você também puder verificar esta pergunta sobre o software center . Obrigado novamente por seu primeiro comentário. estava muito feliz.
Anwar
1
@medigeek, você pode ver esta pergunta para explicar uma pergunta tão incomum.
precisa

Respostas:

38

Na verdade, é bastante fácil com sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1idiz ao sed para inserir o texto a seguir na linha 1 do arquivo; não esqueça a \nova linha no final, para que a linha 1 existente seja movida para a linha 2.

ish
fonte
1
Obrigado. Apenas para a observação: se você deseja substituir, em vez de inserir, use em svez de i in 1i.
Anwar
3
Infelizmente, isso falha no arquivo vazio (ele não tem nenhuma linha de punho, portanto o sed nunca é inserido).
Tino
@Tino Para arquivos vazios você pode apenas usarecho "Text Here" >> Filename
Flotolk
não funciona no MacOS 10
Krishna
7

Na edição geral no lugar com um script é complicado, mas você pode usar echoe catem seguida,mv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

No entanto, se você estiver jogando com o sources.list, precisará adicionar alguma validação e prova de balas para detectar erros, etc., porque você realmente não quer perder isso. Mas essa é uma pergunta separada :-)

Sean
fonte
Eu já posso fazer isso. Eu preciso de uma solução de uma linha como izx deu. no entanto, obrigado pela sua resposta.
Anwar
1
@AnwarShah - ah, desculpe! Você deveria ter dito isso na sua pergunta :-) #
Sean Sean
Eu admito, +1 pela sua resposta e também pelo comentário. (Eu não posso dar mais)
Anwar
6
./prepend.sh "myString" ./myfile.txt

conhecido que prependé meu shell personalizado :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Use também um caminho relativo ou caminho absoluto, ele deve funcionar bem:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Atualização:

se você deseja um script permanente para isso, abra nano /etc/bash.bashrce adicione esta função no final do arquivo:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Reabra seu terminal e aproveite:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
fonte
5

E por que não usar um editor de texto genuíno para isso? ed é o editor de texto padrão.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Ou, se você deseja que os comandos sejam mais legíveis:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: ir para firstline
  • i: modo de inserção
  • suas coisas que você deseja inserir ...
  • .: pare de inserir, volte ao modo normal
  • wq: escreva e saia, obrigado, adeus.
gniourf_gniourf
fonte
Como usar a substituição de variáveis ​​de shell (no FIRST LINE) com isso?
Vp_arth
1
@vp_arth Se o seu conteúdo é variável first_line, em seguida: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Certifique-se de que a variável não se expanda para um único ponto e não contenha caracteres de nova linha (por isso, desinfecte-a se vier da entrada do usuário).
Gnourf_gniourf
3

Sempre há a awkopção. Substitua a stringvariável pelo seu conteúdo. Esta não é uma alteração no local. Pessoalmente, costumo não fazer alterações no local. Esta é definitivamente uma preferência pessoal. Duas coisas, -vsignifica uma variável no awk e a variável né usada aqui para corresponder efetivamente a um número de linha NR == 1. Você pode usar isso de várias maneiras apenas alterando o valor de ne s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Exemplo:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
slashdot
fonte
2

Você pode usar o Vim no modo Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 selecione a primeira linha

  2. i insira nova linha de texto

  3. x salvar e fechar

Steven Penny
fonte
Muito mais simples do que outras soluções fornecidas até agora. Obrigado.
Pothi Kalimuthu