Se você fizer isso:
sed r file1 file2
... então sed
tentará e falhará ao anexar um arquivo r
ead com um nome de arquivo de tamanho nulo a cada linha de entrada de ambos os arquivos de entrada nomeados file1
e < em> file2
. Esse comando não é essencialmente diferente de:
sed '' file1 file2
... exceto que w / r
é mais lento.
É isso que quero dizer:
seq 1 5 > file1
seq 6 10 > file2
strace sed r file[12]
...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...
Veja o open("" ...)
com ENOENT
após cada linha escrita? Isso é o comando r
ead vazio sed
é executado. Você não percebe as falhas porque sed
está definido para não reclamar sobre um arquivo r
ead inexistente chamado em seu script, mas sim para continuar como se nada tivesse acontecido quando tentou r
ead 1.
E talvez pareça que funcione porque você só deseja anexar um arquivo ao final de outro - para con cat
enate dois arquivos - que sed
faz por padrão quando dois arquivos são nomeados - ele lê o primeiro e depois o próximo. Mas se o comando r
ead realmente funcionasse, então o arquivo r
ead nomeado seria anexado inteiramente à linha every na entrada.
Assim:
seq 3 > file
printf %s\n a b c |
sed r\ file
a
1
2
3
b
1
2
3
c
1
2
3
Para anexar o conteúdo de um arquivo a outro, você pode fazer:
cat < file2 >> file1
Para acrescentar depois de apenas um certo ponto na entrada, você tem algumas opções. sed
está entre eles:
sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1
... que deve funcionar com praticamente qualquer sed
.
Ou então, se você tiver um POSIX sed
:
{ sed /match/q; cat file2 -; } < file1
... o que deve ser muito mais eficiente.
Ambos os métodos garantem que o conteúdo de file2
seja apenas r
uma vez e apenas imediatamente após o primeiro ocorrencia de match
em file1
.
Outra maneira poderia parecer:
cat file2 | sed /match/r\ /dev/fd/0 file1
... que leria um arquivo de comprimento nulo depois de cada partida após o primeiro ...