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
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
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
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
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. Atualizado : Obrigado ao @Wildcard por apontar a diferença do Sed do GNU
sed
Experimente o seu terminal:
sed -i '' "1i\
$(head -n 1 file_to_get_first_line_from)" file_to_insert_into
sed -i '' "1i\ e, em seguida, pressionar Enter para continuar o restante do comando $( ) . Substitui quaisquer comandos bash que estejam dentro de $( ) , com sua saída ' para " cotações para permitir que o Bash aja enquanto ainda usa cotações para sed para ver corretamente um comando sed sed
Ou se você tiver o GNU sed:
sed -i "1i $(head -n 1 file_to_get_first_line_from)" file_to_insert_into
sed (GNU sed) 4.2.2 . Para ver sua versão sed: sed --version
\ 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.
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 Tags text-processing sed head