Сортувати файл "за абзацом" у Vim


2

Дано файл, який виглядає так:

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.

Як я можу сказати Vim (версія 7), щоб сортувати цей файл в алфавітному порядку за іменем тварин? Неможливо? Як ще можна було б сортувати цей файл?

Відповіді:


6

Так, ви можете це зробити in vim:

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

вихід

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.

Ви повинні використовувати спеціальний знак для позначення EOL (крім $)!


3

Як ще можна було б сортувати цей файл?

$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.

Там, де є сортографи

#!/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;

Можливо, є кращий варіант Perl, але вищесказане - швидка відповідь.

Якщо файл більший за об'єм пам'яті, може бути розумним перетворити файл у рядок на тварину, сортувати та нарешті перетворити назад.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.