Não sabe como fazer isso de uma só vez. Mas se o conteúdo for bem conhecido, pode-se adicionar uma string única a linhas duplas.
# Add XX to lines that should be deleted
g/^$/+1s/^$/XX/
# Delete them
g/XX/d
Não é muito legal.
Arquivo de entrada:
1 line1\
2 line2\
3 line3\
4 \
5 line4\
6 \
7 \
8 line5\
Saída desejada:
1 line1
2 line2
3 line3
4
5 line4
6
7 line5
É possível com POSIX ed
?
Remover as barras invertidas à direita é fácil, mas como também posso lidar com barras pretas consecutivas como a saída esperada?
Com sed
, você poderia fazer:
sed 's/\$//;/./,/^$/!d'
Um dos principais problemas com ed
(além de sua sintaxe de outra idade) é o tratamento de erros no script.
Basicamente, você tem que pensar nisso como ed
retorna sucesso se ele editou o arquivo com sucesso. Mas, para ser uma edição bem-sucedida, você precisa ter o endereço de cada comando para ser válido, cada comando seja bem-sucedido (por exemplo, para o comando s
, isso significa que pelo menos uma substituição foi feita).
Portanto, se você quiser verificar se a edição foi bem-sucedida nesse caso, pode ser complicado.
Para desenvolver a solução do @Sukmon e tentar cobrir os casos de canto, pode-se escrever:
printf '%s\n' a a . 'g/\$/s///' ',s/^/a/' 'g/^a$/+1,/./s/^a$//' \
'v/./d' 'g/^a/s///' '$d' w | ed -s the-file
O comando g
falharia se o arquivo estivesse vazio (porque o intervalo de endereços padrão ( 1,$
) seria inválido, por isso precisamos primeiro adicionar uma linha no final do arquivo (com o a
comando). ,s/\$//
falharia se não houvesse nenhuma linha terminando em \
, então precisamos executá-la apenas se houver essas linhas ( g/\$/s///
).
Aqui, em vez de inserir um "xx", supondo que não seja encontrado na entrada, prefixamos "a" em cada linha e substituímos as linhas a serem removidas com uma linha vazia que removemos depois.
Esperançosamente, esse script ed
retornará um status de saída diferente de zero se falhar ao gravar o arquivo (o comando w
falhou). Infelizmente, vi ed
implementações retornando sucesso ao falhar ao gravar um arquivo quando o FS estava cheio.
IMO, ed
é melhor evitado. Hoje em dia, usar perl -pi.back
é tão portátil e confiável.