Removendo newlines consecutivas com ed

2

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?

    
por user28512 09.12.2012 / 18:05

2 respostas

2

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.

    
por 10.12.2012 / 06:27
3

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.

    
por 10.12.2012 / 08:36

Tags