SED - Inserir arquivo na parte superior de outro

5

Eu tenho tentado inserir um arquivo como a primeira linha de outro com o seguinte comando SED, sem muito sucesso. Cada vez que o arquivo é inserido após a linha 1. Existe um switch que será inserido antes da linha 1?

sed -i '1r file1.txt' file2.txt

Obrigado antecipadamente.

    
por user68650 14.01.2017 / 22:09

4 respostas

5

O sed command r colocará o conteúdo do arquivo especificado na saída antes de ler a próxima linha de entrada. Infelizmente você não pode especificar 0 como o endereço para este comando, então não há como inserir o conteúdo de um arquivo antes da primeira linha de entrada (sem vasculhar o espaço de espera).

Você poderia, no entanto, usar apenas o antigo cat . É, afinal de contas, o comando para concatenar arquivos:

$ cat file1.txt file2.txt >out && mv out file2.txt

Para ter certeza de que você está escrevendo em um arquivo temporário que ainda não existe, pode-se usar o utilitário mktemp :

$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt

Isso é um pouco estranho na linha de comando, mas é uma boa precaução em qualquer script que precise gravar em um arquivo temporário.

    
por 14.01.2017 / 22:16
5

Com o comando N

Contanto que file2.txt tenha mais de uma linha (veja a outra seção):

sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt

O truque é adiar a impressão da primeira linha com o comando N .

Do manual:

N

Append the next line of input into the pattern space.

Com o comando e

Contanto que file2.txt não esteja vazio (senão faça uma cópia):

sed -i -e '1 e cat file1.txt' file2.txt

O GNU sed fornece um comando e que executa o comando no parâmetro. O resultado é a saída é imediatamente.

Do manual:

e [COMMAND]

This command allows one to pipe input from a shell command into pattern space. Without parameters, the 'e' command executes the command that is found in pattern space and replaces the pattern space with the output; a trailing newline is suppressed.

If a parameter is specified, instead, the 'e' command interprets it as a command and sends its output to the output stream.

Note that, unlike the 'r' command, the output of the command will be printed immediately; the 'r' command instead delays the output to the end of the current cycle.

    
por 14.01.2017 / 22:24
3

Se você está determinado a evitar cat ing para um arquivo temporário explícito (ou por meio de um buffer como sponge ), então parece que ed aceitará pelo menos um endereço 0 para seu r comando:

ed -s file2.txt << EOF
0r file1.txt
wq
EOF

ou equivalentemente

printf '0r file1.txt\nwq\n' | ed -s file2.txt
    
por 14.01.2017 / 22:22
2

Se você deseja inserir o mesmo arquivo sobre vários arquivos dentro do mesmo diretório, o seguinte é baseado na resposta de Kusalananda pode ser usado:

for i in file*; do tmp="$(mktemp)" && cat file1 $i >"$tmp" && mv "$tmp" $i; done
    
por 06.11.2017 / 13:09

Tags