Usando sed para substituir as primeiras n linhas em um arquivo com as primeiras n linhas de outro arquivo (digamos n = 5)

3

Estou tentando substituir linhas de um arquivo ( arquivo1 ) pelo mesmo número de linhas e nas mesmas posições de outro arquivo ( arquivo2 ). Eu encontrei

sed -n 1,5p file2

extrairia as primeiras cinco linhas de arquivo2 . Como posso usar essas linhas e substituir as primeiras cinco linhas em arquivo1?

    
por Pavan 20.11.2017 / 08:15

3 respostas

3

Pouco trapaceiro, (não puro sed ), usando sponge :

{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
    
por 20.11.2017 / 08:23
7

Para edição no local com o GNU sed , há a opção -i . O comando R ead line , (que lê uma linha de um arquivo nomeado e, em seguida, cada linha depois disso, quando executado novamente), é útil aqui. Versão de duas linhas:

sed -i '1,5{R file2
        d}' file1

Notas:

    A saída de
  • R linha ead não é alterada pela d elete que segue. R insere cada linha de arquivo2 após d excluir uma linha de arquivo1 . O d não pode ir primeiro (se o fizer, o comando R não será executado, d é como next in awk )

  • A linha ead de R (como todos os comandos que usam um nome de arquivo) exige que o nome do arquivo seja delimitado por um avanço de linha. O separador de comando ; usual é ignorado, R interpreta R file2; como um nome de arquivo que termina com um literal " ; ". O mesmo com espaços, R interpreta R file2 ; como um nome de arquivo que termina com um literal " ; "

  • R não é afetado por -i , então arquivo2 não será alterado.

Para ajustar isso em uma linha , pode-se passar dois -e xpressions que sed une com linefeeds para formar o script sed :

sed -i -e '1,5{R file2' -e 'd}' file1

Caso contrário, você não precisa de sed :

{ head -n 5 file2; tail -n +6 file1; } > file3

No caso geral, para substituir $x1 para $y1 linhas de file1 com $x2 para $y2 linhas de file2 :

sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1

Ou:

{
  head -n "$((x1 - 1))"
  tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
  tail -n "+$((y1 - x1 + 2))"
} < file1 > file3 
    
por 20.11.2017 / 09:33
0

Que tal usar um arquivo tmp?

sed -n ‘1,5p’ file2 > file3 ; sed ‘1,5d’ file1 >> file3 ; mv file3 file1
    
por 20.11.2017 / 08:52

Tags