Remova as quebras de linha forçadas da saída do fortune enquanto as preserva para a linha do autor

1

Recentemente, encontrei o ótimo comando fortune e usei agora para enviar uma cotação noturna para um bate-papo persistente.

Agora, pergunto-me como remover as quebras de linha forçadas para a parte quote , mas preservá-las em torno da linha do autor no final.

Por quê? Devido às larguras variadas das janelas de bate-papo, a saída resultante é dividida em linhas duplas na maioria dos casos (isso não foi bem expresso, mas você pode ter entendido o que quero dizer - se não e isso é importante para você, fique à vontade para pedir esclarecimentos) ).

Claro que já procurei uma solução e encontrei:

echo -n 'fortune'

mas isso remove todas as quebras de linha, obviamente.

O mais apreciado seria uma solução sh compatível, mas no caso de maior simplicidade, bash (outros?) seria uma opção também.

Atualização 2016-02-12:

Exemplo de saída de fortuna com várias linhas, conforme solicitado:

me@myhost:~$ fortune
Mit jemand leben oder in jemand leben, ist ein großer 
Unterschied. Es gibt Menschen, in denen man leben kann, ohne mit 
ihnen zu leben, und umgekehrt. Beides zu verbinden, ist nur der 
reinsten Liebe und Freundschaft möglich.
        -- Goethe, Maximen und Reflektionen, Nr. 649
me@myhost:~$ 

A solução proposta abaixo faz isso:

me@myhost:~$ fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'
Die so genannten Naturdichter sind frisch und neu aufgeforderte, 
aus eine rüberbildeten, stockenden, manierierten Kunstepoche 
zurückgewiesene Talente. Dem Platten können sie nicht ausweichen, man 
kann sie daher als rückschreitend ansehen; sie sind aber 
regenerierend und veranlassen neue Vorschritte. -- Goethe, Maximen und Reflektionen, Nr. 258
me@myhost:~$ 

Esta é uma proposta bastante boa, embora não forneça a solução desejada exata. Faz o oposto do que estou tentando alcançar. Assim que eu entender a expressão sed, vou tentar inverter a lógica ... fique à vontade para ser mais rápido que eu! : D

    
por Nicolas 11.02.2016 / 18:41

3 respostas

1
echo $(fortune) | sed 's/-- /\n    -- /'

Insira quantos espaços à esquerda você quiser antes da linha de autor. Isso simplesmente usa echo para remover os retornos de carro e substitui o prefixo de autor por uma nova linha e o prefixo do autor.

    
por 12.02.2016 / 21:23
0

Isso é principalmente roubado de aqui :

fortune | sed ':a;N;$!ba;s/\n[[:space:]]\{2\}--/ --/'

Da resposta original:

Explanation:

  1. Create a label via :a.
  2. Append the current and next line to the pattern space via N.
  3. If we are before the last line, branch to the created label $!ba ($! means not to do it on the last line as there should be one final newline).

O passo final é o único que eu modifiquei. Como o padrão é duas linhas concatenadas, procure -- precedido por dois ou mais espaços em branco e uma nova linha (AFAIK esse padrão aparece apenas nas aspas). Substitua a nova linha por um único espaço e adicione de volta no -- que foi removido.

Antes:

There is always one thing to remember: writers are always selling somebody out.    
            -- Joan Didion, "Slouching Towards Bethlehem"

Depois:

There is always one thing to remember: writers are always selling somebody out. -- Joan Didion, "Slouching Towards Bethlehem"
    
por 11.02.2016 / 20:30
0

Poder-se-ia tratar o arquivo como uma única string, depois substituir apenas as novas linhas seguidas por duas novas linhas. Esta solução assume linhas não em branco.

bash-4.1$ cat input 
duck
duck
duck
  -- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
  -- goose
bash-4.1$ 

Outra solução seria construir as linhas em uma matriz de linhas na memória, depois unir essa matriz com espaços, exceto a linha final, ou contar quantas linhas existem primeiro, e então com esse número determinar quando newline deve ser convertido em um espaço ou deixado sozinho.

    
por 12.02.2016 / 20:47