Como insiro a primeira linha de um arquivo na primeira linha do outro?

0

Eu tenho um comando head para obter a primeira linha de um arquivo e um comando sed para inserir antes da primeira linha de um arquivo. Como eu combino estes para que eu possa inserir a primeira linha extraída de um arquivo antes da primeira linha de outro arquivo.

Obtenha a primeira linha de um arquivo

head -n 1 file_to_get_first_line_from

Inserir antes da primeira linha

sed -i '1 i\insert_this_in_the_first_line' file_to_intert_into
    
por T. Brian Jones 05.04.2016 / 18:58

4 respostas

2

Se o seu file_to_insert_into não terminar com nova linha:

$ cat <<IN > file_to_insert_into
$(head -n1 file_to_get_first_line_from; cat file_to_insert_into)
IN
    
por 05.04.2016 / 19:27
1

A maneira mais portátil de fazer isso é usar os recursos especificados POSIX de ex .

$ cat file1
Jack and Jill
Went up the hill
To fetch a pail of water.

$ cat file2
Nursery Rhymes:
Epic Poems:
Classic Literature:

$ printf '%s\n' '0r !head -n 1 file2' x | ex file1

$ cat file1
Nursery Rhymes:
Jack and Jill
Went up the hill
To fetch a pail of water.
  • printf é usado para enviar comandos para ex .
  • 0 é o endereço fornecido para o comando r ead; ele diz ex para ler no texto especificado "após a linha 0" (ou seja, antes da linha 1).

  • !head -n 1 file2 significa que, em vez de r eading texto diretamente de um arquivo (um arquivo inteiro ), o comando head é executado primeiro e sua saída é lida em ( na posição especificada, linha 0).

  • x significa salvar e sair.

Isso é totalmente compatível com POSIX e portátil.

Se você estava criando scripts, seria uma boa prática verificar suas suposições: que file2 existe e é legível e que file1 é legível e gravável, se existir.

if [ -r file2 ] && [ -f file2 ] && { ! [ -e file1 ] || { [ -r file1 ] && [ -w file1 ];};}; then
  printf '%s\n' '0r !head -n 1 file2' x | ex file1
fi
    
por 05.04.2016 / 21:32
0

Com o Vim e head :

vim -Nesc '0r !head -n1 file_to_get_first_line_from' +wq file_to_insert_into
  • -Nes inicia não-compatível, silencioso, ex-mode, o que é útil quando você deseja executar scripts de tarefas com o Vim.
  • -c '0r !<cmd>' insere a saída do comando <cmd> antes da primeira linha. O comando aqui é, obviamente, o comando head .
  • +wq salva e fecha o arquivo.
por 05.04.2016 / 20:04
0

Atualizado : Obrigado ao @Wildcard por apontar a diferença do Sed do GNU

BSD sed

Experimente o seu terminal:

sed -i '' "1i\
$(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • Isso significa começar a digitar sed -i '' "1i\ e, em seguida, pressionar Enter para continuar o restante do comando

Explicação

  • Ajuda a combinar seus dois comandos originais por meio da substituição do comando Bash $( ) . Substitui quaisquer comandos bash que estejam dentro de $( ) , com sua saída
  • Alteramos as cotações literais ' para " cotações para permitir que o Bash aja enquanto ainda usa cotações para sed para ver corretamente um comando sed

GNU sed

Ou se você tiver o GNU sed:

sed -i "1i $(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • Testado com sed (GNU sed) 4.2.2 . Para ver sua versão sed: sed --version
  • O GNU sed pode omitir o \ e a nova linha. info sed , em sed Programs , Common Commands :

As a GNU extension, if between the 'a' and the newline there is other than a whitespace-'\' sequence, then the text of this line, starting at the first non-whitespace character after the 'a', is taken as the first line of the TEXT block. (This enables a simplification in scripting a one-line add.) This extension also works with the 'i' and 'c' commands.

Informações adicionais

  • Opcionalmente, há uma versão mais curta do comando head: head -1 . No entanto, info head alega que este é um obsolete option syntax -[NUM]... que a cabeça suporta, e recomenda para "hosts padrão" usar a sintaxe -n NUM , para que possamos continuar usando sua sintaxe head -n 1 original aqui
por 05.04.2016 / 19:16