Eu tenho alguns arquivos de texto que uso para fazer anotações - apenas texto sem formatação, geralmente apenas usando cat >> file
. Ocasionalmente, uso uma ou duas linhas em branco (basta retornar - o caractere de nova linha) para especificar um novo assunto / linha de pensamento. No final de cada sessão, antes de fechar o arquivo com Ctrl+ D, normalmente adiciono lotes (5 a 10) de linhas em branco (tecla de retorno) apenas para separar as sessões.
Obviamente, isso não é muito inteligente, mas funciona para mim para esse fim. Eu faço no entanto acabar-se com lotes e lotes de linhas em branco desnecessários, por isso estou procurando uma maneira de remover (a maior parte) as linhas extras. Existe um comando Linux (recortar, colar, grep, ...?) Que possa ser usado diretamente com algumas opções? Como alternativa, alguém tem uma idéia para um script sed, awk ou perl (bem em qualquer linguagem de script, na verdade, embora eu prefira sed ou awk) que faça o que eu quero? Escrever algo em C ++ (o que eu realmente poderia fazer) parece apenas um exagero.
Caso 1: O que eu preciso é de um script / comando que remova mais de duas (3 ou mais) linhas em branco consecutivas e as substitua por apenas duas linhas em branco. Embora seria bom se também pudesse ser ajustado para remover mais de uma linha (2 ou mais) e / ou substituir várias linhas em branco por apenas uma linha em branco.
Caso 2: Eu também poderia usar um script / comando que removeria uma única linha em branco entre duas linhas de texto, mas deixaria várias linhas em branco como estão (embora a remoção de uma das linhas em branco também seja aceitável).
vim
e substituía as linhas em branco por uma linha em branco).Respostas:
Caso 1:
Caso 2:
fonte
Você pode usar
uniq
para recolher várias instâncias de linhas em branco em uma linha em branco, mas também recolherá linhas que contêm texto, se forem iguais e abaixo uma da outra.fonte
Caso 1:
Caso 2:
fonte
Você pode abordar o Caso 1 como este com o GNU sed:
Ou seja, colete linhas vazias no espaço padrão e, se houver mais de três ou mais linhas, reduza-o para duas linhas.
Para unir linhas com espaço único, como no Caso 2, você pode fazer o seguinte:
Ou no formato comentado:
fonte
Esta solução também cuida das últimas linhas em branco no arquivo:
fonte
Seguindo a sugestão de Anthon de usar "uniq" ...
Remova linhas em branco iniciais, finais e duplicadas.
Em uma linha longa:
Ou apenas use "cat -s".
Eu mudei de parênteses para chaves, a fim de permanecer no contexto atual do shell, que suponho ser mais eficiente. Observe que os chavetas requerem ponto e vírgula após o último comando e precisam de um espaço para separação.
Em uma única linha.
fonte
As soluções postadas pareciam um pouco enigmáticas para mim. Aqui está a solução no Python 3.6:
Você pode chamar as funções de um intérprete ou executá-lo a partir do shell, como:
fonte