Existem algumas maneiras de resolver esse problema sed. Uma maneira é uma leitura atrasada, conforme recomendado na resposta aceita. Também poderia ser escrito como:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... com um olhar explícito e pouco explícito, em vez do olhar para trás implementado em outro lugar com o buffer de espera. Isso inevitavelmente terá o mesmo problema com a última linha que o @don_crissti observa, porqueN faz incremento do ciclo de linha eor comando ead é aplicada por número da linha.
Você pode contornar isso:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Nem todos os seds interpretam o -significado de entrada padrão, mas muitos o fazem. ( POSIX diz que sed deve apoiar- deve significar entrada padrão se o implementador quiser -significar entrada padrão ???)
Outra maneira é manipular o conteúdo anexado em ordem. Há outro comando que agenda a saída da mesma maneira que o read faz, e sedo aplicará e rna ordem em que estão no script. No entanto, é um pouco mais complicado - implica o uso de um sedpara apendurar a Pointercorrespondência na saída de outrosed em seu script.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Então, basicamente, o primeiro sedescreve o segundo, sedum script, que o segundo sedlê na entrada padrão (talvez ...) e se aplica por sua vez. O primeiro sedfunciona apenas na primeira correspondência para Pointerencontrado e, depois, qutiliza a entrada. Seu trabalho é ...
s/[]^$&\./*[]/\\&/g;H
- Certifique-se de que todos os caracteres padrão sejam escapados com segurança pela barra invertida, porque o segundo
sedprecisará interpretar cada parte que lê literalmente para acertar. Feito isso, coloque uma cópia no Hespaço antigo.
s|.*|/&/!p;//!d|p; x
- Diga ao segundo
sedpara criar ptodas as linhas de entrada, !exceto a /&/que acabamos de proteger; e depois dexcluir tudo da mesma forma. print os comandos no segundo e sed, em seguida, e xaltere os hbuffers antigo e padrão para trabalhar em nossa cópia salva.
s|.|r file1&a\\&|p;q
- O único caractere com o qual trabalhamos aqui é um
\newline, porque ele sedserá anexado quando o Hcampo for delimitado anteriormente. Então, inserimos o comando r file1e o seguimos com nosso\n ewline, depois o comando a\\para append seguido também por um \newline. Todo o resto da nossa Hlinha de campo segue a última linha de \new.
O script que o primeiro escreve é mais ou menos assim:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Basicamente, o segundo sedimprime todas as linhas, mas a primeira sedconfigura-a como apendente. Para essa linha específica, estão programadas duas gravações atrasadas na saída padrão - a primeira é a read de file1eo segundo é uma cópia da linha queremos depois. O primeiro sedmédico não é necessário neste caso consulta (veja? Sem barras invertidas), mas é importante escapar com segurança da maneira que faço aqui sempre que uma correspondência de padrão é redirecionada como entrada.
Enfim, então ... existem algumas maneiras.