Pouco trapaceiro, (não puro sed
), usando sponge
:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
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?
Pouco trapaceiro, (não puro sed
), usando sponge
:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
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:
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
Que tal usar um arquivo tmp?
sed -n ‘1,5p’ file2 > file3 ; sed ‘1,5d’ file1 >> file3 ; mv file3 file1
Tags sed