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 sed
s 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 r
ead faz, e sed
o aplicará e r
na ordem em que estão no script. No entanto, é um pouco mais complicado - implica o uso de um sed
para a
pendurar a Pointer
correspondê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 sed
escreve o segundo, sed
um script, que o segundo sed
lê na entrada padrão (talvez ...) e se aplica por sua vez. O primeiro sed
funciona apenas na primeira correspondência para Pointer
encontrado e, depois, q
utiliza 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
sed
precisará interpretar cada parte que lê literalmente para acertar. Feito isso, coloque uma cópia no H
espaço antigo.
s|.*|/&/!p;//!d|p; x
- Diga ao segundo
sed
para criar p
todas as linhas de entrada, !
exceto a /&/
que acabamos de proteger; e depois d
excluir tudo da mesma forma. p
rint os comandos no segundo e sed
, em seguida, e x
altere os h
buffers 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
\n
ewline, porque ele sed
será anexado quando o H
campo for delimitado anteriormente. Então, inserimos o comando r file1
e o seguimos com nosso\n
ewline, depois o comando a\\
para a
ppend seguido também por um \n
ewline. Todo o resto da nossa H
linha de campo segue a última linha de \n
ew.
O script que o primeiro escreve é mais ou menos assim:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Basicamente, o segundo sed
imprime todas as linhas, mas a primeira sed
configura-a como a
pendente. Para essa linha específica, estão programadas duas gravações atrasadas na saída padrão - a primeira é a r
ead de file1
eo segundo é uma cópia da linha queremos depois. O primeiro sed
mé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.