Intereting Posts
Показать записи исключения маршрутизации ядра (FIB) Как вы переносите части имени файла в Linux? Настройка целей iSCSI Как восстановить с экрана скремблирования? В bash, каковы потенциальные негативные последствия приостановки процесса с контролем-z? Список файлов + каталог, рекурсивно отсортированный по времени доступа Как перенаправить список человеческих читаемых путей на другую команду? почему grep '\ ;.' expand to grep '\' '\;.' \ '' 'при выполнении над ssh? Изменить и сохранить настройки аннотации PDF в Okular? как изменить консоль tty после загрузки? разрешение отклонено после команды ssh, даже если пароль правильный печать и не выполнение результата расширения истории zsh при частичном поиске Можно ли отключить перечисление пользователей Samba? Как переименовать файлы и каталог с *. ~ 1 ~ суффикс в исходное имя? Комментарии в списках аргументов?

Конкатенировать блок строк со следующим блоком линий

Я пытаюсь обработать некоторый текст, экспортированный из слайдов лекций, используя pdf2text. Точки пули некоторых слайдов выглядят следующим образом:

title for the list - - - a bullet point text another bullet point text yet another bullet point text - nested bullet point - another nested bullet point - yet another nested bullet point title for the next list 

Я бы связал их в правильный (уцененный) список следующим образом:

 title for the first list - a bullet point text - another bullet point text - yet another bullet point text - nested bullet point - another nested bullet point - yet another nested bullet point title for the next list 

Просто сделал это, используя скрипт bash

 #!/bin/bash c=0 [[ $# -eq 0 ]] && { echo "Error: Please Specify Input file" >&2; exit 1; } while read line do if [[ $line = "-" ]]; then (( c++ )) if [[ $c -eq 1 ]]; then echo "" fi elif [[ $line != "" ]] && [[ $c -ne 0 ]]; then echo "- ${line}" (( c-- )) if [[ $c -eq 0 ]]; then echo "" fi elif [[ $line =~ "- " ]] && [[ $c -ne 0 ]]; then echo " $line" else echo "$line" fi done < $1 

Протестировано и работает с примером ввода.

Кредит на @Rahul, но модифицированная версия:

 #!/bin/bash if [[ -z "$1" || ! -f "$1" ]]; then printf "Usage: %s <FILE>\n" "$(basename $0)" exit 1 fi c=0 eoli=0 pad=4 while read line do if [[ "$line" = "-" ]]; then (( c++ )) elif (( c > 0 )); then echo "- $line" ! (( --c )) && eoli=1 elif ((eoli)) && [[ "$line" =~ ^-\ ]]; then printf "%-*s%s\n" $pad "" "$line" else eoli=0 echo "$line" fi done < "$1" 

Использование awk:

 #!/usr/bin/awk -f BEGIN { c=0 eoli=0 pad=4 }; { if (/^-$/) { ++c } else if (c > 0) { printf "- %s\n", $0 eoli = (--c == 0) } else if (eoli && /^- /) { printf "%*s%s\n", pad, "", $0 } else { eoli=0 print $0 } }