Altere “\ n” por “|” entre 2 padrões (padrões excluídos) com sed

2

Eu gostaria de mudar \ n por | entre 2 padrões (padrões excluídos) com sed.

Eu tenho um arquivo com uma sequência de endereços várias vezes:

Adress:
1540 Broadway
New York
NY 10036
United-states
###

Eu gostaria de obter isso:

Adress:1540 Broadway|New York|NY 10036|United-states
###

Eu uso o seguinte código de linha:

sed -i "/^Adress:/!b;:a;/###/bb;$!{N;ba};:b;s/\n/\|/g;tb" file.txt

... mas inclui os dois padrões e eu recebo este resultado errado:

Adress:|1540 Broadway|New York|NY 10036|United-states|###

Como mudá-lo para excluir padrões do substituto?

    
por Syl87 27.06.2017 / 12:44

1 resposta

2

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 ...)

    
por 27.06.2017 / 16:07

Tags