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