Como inverter a ordem das seções de texto de múltiplas linhas separadas por novas linhas / quebras de linha em branco?

2

Como reverter a ordem das seções de texto de várias linhas separadas por novas linhas / quebras de linha em branco ...

..., com um simples comando ou aplicativo, preferencialmente sem programação?

Eu não quero um tipo, mas apenas uma ordem inversa das seções de texto.

Por exemplo:

A
B

0
1

X
YX
Y

HTTP
FTP

torna-se

HTTP
FTP

X
YX
Y

0
1

A
B
    
por XP1 27.04.2011 / 19:29

3 respostas

2

tac aceita um separador, portanto, por exemplo bash você pode fazer:

tac -s $'\n\n' foo

que produzirá uma saída ligeiramente incorreta porque o último parágrafo não é terminado por uma nova linha dupla. Então,

(cat foo; echo) | tac -s $'\n\n' | sed '$d'

é provavelmente o que você deseja. (Conteúdos de tubulação de foo e nova linha até tac , depois sed para remover a última linha.)

Observação: não redirecione isso para > foo novamente, pois você pode acabar com um arquivo vazio.

    
por 30.04.2011 / 13:50
2

Embora o autor não prefira soluções de programação, o uso do Python seria bastante fácil em uma linha:

open('output.txt', 'w').write('\n\n'.join(reversed(open('input.txt', 'r').read().split('\n\n'))))

Obviamente, substitua input.txt e output.txt pelos arquivos desejados e altere \n para \r\n para arquivos de texto formatados no Windows.

Coloque isso em um arquivo .py e chame-o via python myscript.py .

    
por 29.04.2011 / 05:20
1

Se você estiver usando o Windows, pode simplesmente usar o Powershell. Isso inverte o conteúdo de test.txt e salva o resultado em test2.txt :

$f=Get-Content c:\folder\test.txt
[array]::Reverse($f)
$f | out-file c:\folder\test2.txt

Atualização:

Isso deve fazer o truque (lê todas as linhas de test.txt e as reorganiza para o arquivo test2.txt da maneira que você queria):

$content = [System.IO.File]::ReadAllLines("C:\Folder\test.txt")
$a = New-Object System.Collections.ArrayList
$i=0
ForEach ($line in $content) {If ($line -ne "") {$a.insert($i++, $line)} else {$a.insert(0, $line); $i=0}}
$a | out-file C:\Folder\test2.txt

Provavelmente não é a maneira mais elegante, mas fez o trabalho com o seu caso de teste.

    
por 27.04.2011 / 20:54