Como inserir texto antes da primeira linha de um arquivo?

50

Eu tenho procurado o comando sed para adicionar texto em um arquivo em uma linha específica. Isso funciona adicionando texto após a linha 1:

sed '1 a\

Mas eu quero adicionar antes da linha 1. Seria:

sed '0 a\

mas recebo este erro: invalid usage of line address 0 .

Alguma sugestão?

    
por Manolo 08.11.2013 / 12:31

9 respostas

72

Use a opção de inserção de sed ( i ), que inserirá o texto na linha anterior.

sed '1 i\

Atualização do autor da pergunta:

Para editar o arquivo - com o GNU sed - eu tive que adicionar o arquivo     -i option:

sed -i '1 i\anything' file

Também sintaxe

sed  -i '1i text' filename

Para o sed não-GNU

Você precisa pressionar a tecla de retorno imediatamente após a barra invertida 1i\ e depois de first_line_text :

sed -i '1i\
first_line_text
'

Observe também que algumas implementações não-GNU sed (por exemplo, a do macOS) requerem um argumento para o sinalizador -i (use -i '' para obter o mesmo efeito que com GNU sed ).

    
por 08.11.2013 / 12:38
12

Você pode usar o Vim no modo Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 selecione a primeira linha

  2. i inserir texto e nova linha

  3. x salvar e fechar

por 17.04.2016 / 04:08
7

Você deseja inserir texto antes da primeira linha, em vez de anexar , depois usar

sed '1 i\
your_text' your_file

Um documento aqui também pode ajudar:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
    
por 08.11.2013 / 12:38
7

O eco é usado para obter o texto. Nome do arquivo Cat - imprime o arquivo no console e > usa-o para enviar para outro arquivo nome_de_arquivo1 e, em seguida, movemos o nome_do_arquivo1 para o nome do arquivo para que o texto seja inserido na primeira linha do arquivo desejado.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
    
por 08.01.2017 / 18:52
4

Usando o GNU awk > = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Ao contrário de todas as respostas sed , isso também funciona em arquivos vazios.

    
por 28.09.2016 / 22:37
4
sed  -i '1i new_text' file_name

Se você não especificar a opção -i , ela não mostrará nenhum erro e exibirá a saída no terminal padrão, mas não inserirá o texto no arquivo.

    
por 14.03.2016 / 21:26
1

Eu estou surpreso que nesta pergunta antiga ninguém tenha mostrado o comando mais comum (e bem simples neste caso):

$ sed  -i '1s/^/new_text\
/' file_name

Que funciona na maioria das shells e é portátil para várias versões sed.
Se o GNU sed estiver disponível, você pode usar isto:

$ sed -i '1s/^/new_text\n' file_name

A diferença é que o GNU sed permite o uso de um \n para uma nova linha e outros precisam de uma nova linha literal precedida por uma barra invertida (que também funciona no sed do GNU).

Se um shell que aceita a sintaxe $'…' estiver em uso, você poderá inserir a nova linha diretamente, portanto, sed verá que a nova linha já está lá:

$ sed -i $'1s/^/new_text\\n/' file_name

que funciona para mais versões sed.

    
por 14.07.2018 / 05:56
0

O comando 0a que você tentou faz funcionar em ex , o predecessor de vi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

O comando printf por si só gera:

0a
Anything you want to add
.
x

O 0a significa acrescentar após a 0ª linha (ou seja, antes da primeira linha).

A próxima linha ou várias linhas é o texto literal a ser adicionado.

O . em uma linha por si só encerra o comando "append".

O x faz com que Ex salve as alterações no arquivo e saia.

    
por 28.10.2016 / 03:32
-1

Infelizmente, todas as respostas acima (principalmente com sed ) não funcionaram para mim, pois todas substituíram a primeira linha. Eu estou em uma máquina Ubuntu 16.04 LTS . Aqui está minha solução alternativa com GNU Awk 4.0.2 :

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
    
por 15.11.2018 / 14:59