Veja a resposta do @ manatwork pelo motivo real de 1h;1!H
, mas eu queria adicionar uma nota de portabilidade .
A sintaxe padrão e portátil deve ser:
sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\
blub/p;}'
Caso contrário, não funcionará na maioria das sed
implementações, por exemplo, as tradicionais Unix.
Isso é \n
é entendido no lado esquerdo do comando s
, mas você precisa usar um caractere de barra invertida seguido por um caractere de nova linha real no lado direito. Você também precisa do ;
entre o comando s
e }
e nenhum espaço antes do p
.
Você também pode armazenar o conteúdo do arquivo no espaço padrão, em vez do espaço de armazenamento:
sed -n '
:1
$!{
N;b1
}
s/foo\nbar/blah\
blup/p'
Mas com padrão e espaço de espera, com a maioria das implementações sed
que só funcionam com arquivos pequenos, já que a maioria das implementações não-GNU tem um tamanho limitado para esses (e POSIX apenas requer que eles consigam conter 8kB de dados ).
Portavelmente, seria melhor usar perl
:
perl -0777 -ne 'print if s/foo\nbar/blah\nblup/'
Como o tamanho não é limitado em perl
ou GNU sed
, no entanto, tenha cuidado com o desempenho do sistema, pois ele pode acabar usando toda a memória do sistema se você não tiver definido administrativamente limites no uso de memória por processo.