Intereting Posts
Автоматизация ввода строк в xmacro iptables маршрутизирует маркированные пакеты с маршрутизатора на ПК и маршрутизирует их обратно на маршрутизатор Рекурсивно выполнить композитную команду imagemagick в дереве каталогов Как определить последнюю версию в URL? Будет ли обновление Postgres на CentOS сломать его? insserv: предупреждение: скрипт «XXX.sh» отсутствует теги LSB и переопределения Экраны умирают, хотя процесс все еще запущен Xinerama misbehaving – перетаскивание на неправильный экран Как я могу реорганизовать список пакетов в графическом режиме (TUI) aptitude? Когда нужно использовать $ () при определении переменных «Sh», запущенный с помощью execl (), становится зомби Перекрестная кнопка стала невидимой после установки compiz есть ли файловая система, что один и тот же путь к файлу перемещается в другой файл, когда к нему обращаются разные пользователи? Как я могу копировать вывод терминала из консоли ssh и вставлять его в окно локальных окон OpenVPN: защитить ваш клиентский ключ / cert / conf от кражи?

Сортировка строк при группировке отступов с их родительским

У меня есть список строк, похожий на книгу, например

day satur- sun- holy- night ball to- eve election christmas 

Теперь я хочу сортировать эти строки в явном виде: я хочу сгруппировать каждый «родительский» ( day , night , eve ) с их соответствующими отступными «дочерними» объектами ( satur- , sun- , …) и сортировать их групп по их родительской записи. Я также хочу сортировать дочерние записи в любой группе.

Таким образом, желаемый результат:

 day holy- satur- sun- eve christmas election night ball to- 

Как бы я мог добиться этого, используя инструменты unix, такие как sort ?

Вы можете выбрать персонажа, который вряд ли встречается в вашем текстовом файле, добавить родительское имя + этот символ к каждой дочерней строке, сортировать, затем удалить родительское имя и разделитель из каждой дочерней строки, например, с помощью gnu sed и низкого ascii char like \x02

 sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//' 

Как это работает:
1-й sed делает следующее:
/^[^[:blank:]]/h – копировать строки без отступов (родителей) на место удержания
//!G – на отступы (дочерние) добавить содержимое пространства удержания в пространство рисунка
s/\(.*\)\n\(.*\)/\2\x02\1/ – подкачки в пространстве шаблонов, заменяющие \n ewline на \x02
после этого sort и удалять все до и включая \x02 со вторым sed 's/.*\x02//'