Сортировать по конкретным строкам в тексте
У меня есть данный текст:
# 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
- Mx
sort-regexp-fields
- Войти:
#[^#]*
- Войти:
\&
Первое регулярное выражение разделяет запись, а второе задает ключ для сортировки.
Если вы можете выбрать маркер и использовать *
вместо #
, вы можете использовать команду 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$", "")
исправляет проблему с пробелами в последней записи.
Примечание: если какой-либо из блоков содержит @
вам нужно выбрать другой разделитель.