Ao lidar com esse tipo de tarefa (editar / fazer algo se linhas consecutivas corresponderem a um determinado padrão), a maneira mais simples de fazê-lo com sed é provavelmente via N;P;D cycle também conhecido como " janela deslizante ":
sed -e '$!N;s/,\nPATTERN//;t' -e 'P;D' file
Isso obtém a linha N ext no espaço padrão e tenta incondicionalmente s ubstitute por o requisito. Em seguida, t ests se a substituição foi bem-sucedida: nesse caso, ela se ramifica ao final do script (sem rótulo) e imprime automaticamente o espaço padrão, caso contrário, P rints e D elimina a primeira linha do espaço padrão. e reinicia o ciclo.
Outro método GNU sed :
sed ':x /,$/{N;s/,\n]//;T x}' file
Isso funciona corretamente mesmo quando a vírgula final está em uma linha com numeração par. Exemplo:
printf '%s\n' 1, 2, ']' | sed ':x /,$/{N;s/,\n]//;T x}'
Saída:
1,
2
Como funciona:
Na maioria das linguagens de programação, os rótulos de endereço são totalmente passivos - os rótulos marcam o código, mas nunca alteram a ação desse código. Não sed embora. Em sed , saltar para um rótulo no início de um programa realmente altera a ação do código, ou melhor, evita o código implícito de n ext-line que um ciclo sed normalmente inicia com.
O comando T est e desvio em caso de falha T x verifica se o comando anterior s ubstitute não fez nada e, se assim for, saltará para o :x label no início sem imprimindo qualquer coisa ou lendo uma nova linha. O que significa que qualquer linha com numeração ímpar buscada pela linha N ext que não foi substituída será verificada novamente, como deveria ser.
Para o não- GNU sed , (quando o comando T não está disponível e a sintaxe não é tão permissiva), isso deve ser mais portátil:
sed ':x
/,$/{
N
s/,\n]//
t
b x
}' file