Não é recomendável usar um loop para esse tipo de tarefa, a menos que você esteja lidando com um pequeno não. de linhas 1 . É melhor usar intervalos e o espaço de espera:
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!d;x;s/\n//;s/\n/|/g;G
}' infile
Ou seja, para cada linha nesse intervalo, faça o seguinte: se não for a última linha do intervalo anexada a manter espaço (sobrescrevendo se for a primeira linha no intervalo) e excluir a linha, senão trocar buffers, remova o primeiro nova linha incorporada e substitua as restantes por |
. Em seguida, anexe o conteúdo do buffer de suspensão ao espaço padrão.
Isso falhará se o último Address
não for seguido por ###
, para evitar isso, use uma segunda condição e exclua apenas se não for a última linha de entrada, caso contrário, anexe para manter o buffer, trocar e sair:
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!{
$!d;H;x;q
}
x;s/\n//;s/\n/|/g;G
}' infile
1: quanto mais linhas você tiver que puxar, mais lento ele ficará, devido à necessidade de verificar constantemente o espaço padrão para uma correspondência - veja os resultados aqui (é um requisito diferente, eu sei, mas só para você ter uma ideia ...)