Ordenar arquivo 'por parágrafo' no Vim

2

Dado um arquivo que se parece com:

Crab
  some text that doesn't need sorting.
  more textual descriptination
Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Dolphin
Pterodactyl
  long story about this particular animal.

Como eu diria ao Vim (versão 7) para classificar este arquivo em ordem alfabética por nome de animal? Impossível? Como mais alguém classificaria esse arquivo?

    
por klokop 06.12.2011 / 08:55

2 respostas

6

Sim, você pode fazer isso no vim:

:%s/$/$/
:g/^\w/s/^/\r/
:1del t | $put t
:g/^\w/,/^$/-1join!
:sort
:%s/\$/\r/g
:g/^$/d

saída

Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Crab
  some text that doesn't need sorting.
  more textual descriptination
Dolphin
Pterodactyl
  long story about this particular animal.

Você deve usar um caractere especial para indicar EOL (diferente de $ )!

    
por 09.12.2011 / 15:22
3

How else would one sort this file?

$perl sortparagraphs animals.txt

Albatross
  some text or other
  perhaps a list that needs no sorting:
    1. a
    2. bee
Crab
  some text that doesn't need sorting.
  more textual descriptination
Dolphin
Pterodactyl
  long story about this particular animal.

Onde sortparagraphs é

#!/usr/local/bin/perl
use strict;
use warnings;

my ($paragraph, @list);
while(<>) {
  if (/^\S/) {
    push @list, $paragraph if $paragraph;
    $paragraph = '';
  }
  $paragraph .= $_;
}
push @list, $paragraph if $paragraph;
print sort @list;

Provavelmente existe uma solução Perl melhor, mas a resposta acima é rápida.

Se o arquivo for maior que a memória, pode ser sensato transformar o arquivo em uma linha por animal, classificar e, finalmente, transformar novamente.

    
por 06.12.2011 / 12:58

Tags