apaga texto específico baseado no próximo conteúdo da linha

1

Eu preciso de um comando para excluir texto específico com base no conteúdo da próxima linha, especificamente eu quero excluir "vírgula" se a próxima linha for "]" e excluir a próxima linha "]" também.

exemplo

987678680,
]
123435434-
]
2345643,
]
2345632-
]
234563,
]
1234567654,
]

saída

987678680
123435434-
]
2345643
2345632-
]
234563
1234567654
    
por don_crissti 08.10.2018 / 15:41

2 respostas

1

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
    
por 08.10.2018 / 16:43
0

Você pode usar sed da seguinte forma:

sed -e '/,$/{N; /\]/s/,[^,]*$//;}' file
987678680
123435434-
]
2345643
2345632-
]
234563
1234567654

Ou por @steeldriver, isso pode ser simplificado em Bash da seguinte forma:

sed '$!N; s/,\n]//'
    
por 08.10.2018 / 15:45