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