Сортировать по конкретным строкам в тексте

У меня есть данный текст:

# Blub
Hello this is a blub text.

# Bla
This is the bla text.

# Abba
Another text.

Можно ли отсортировать строки с #? Так что полученный текст:

# Abba
Another text.

# Bla
This the bla text.

# Blub
Hello this is a blub text.

Предпочтительно использовать vim или emacs.

3 ответа

Решение

В Emacs

  1. Mxsort-regexp-fields
  2. Войти: #[^#]*
  3. Войти: \&

Первое регулярное выражение разделяет запись, а второе задает ключ для сортировки.

Если вы можете выбрать маркер и использовать * вместо #, вы можете использовать команду org-mode org-sort-entries вместо этого, что спасает вас от ввода регулярных выражений.

Что-то вроде:

:sort! /^#.+\n.+\n$/ 

Я не уверен насчет порядка блокировки строк.

Вы не пометили это как таковое, но я думаю, awk это лучший инструмент для работы. С помощью gawk следующие работы:

gawk RS='\n\n' '{ 
  gsub("\n$", "")
  gsub("\n", "@")
  print 
}' file_to_be_sorted | sort | sed -e 's/$/\n/' -e 's/@/\n/'

объяснение

Установив разделитель записей (RS) в '\n\n' gawk создает записи из каждого блока. Каждая запись преобразуется в одну строку с @ в качестве разделителя (gsub("\n", "@")), на данный момент нормально sort работает. sed затем используется для воссоздания блоков. gsub("\n$", "") исправляет проблему с пробелами в последней записи.

Примечание: если какой-либо из блоков содержит @ вам нужно выбрать другой разделитель.

Другие вопросы по тегам