Для такого задания возможно, более полный язык как Python является лучшим соответствием. Можно назвать программы от него или сделать сомнительные дела непосредственно.
Это немного муторно с sed
, но возможно:
sed -n '
:start
/^\[/{
h
:loop
n
/^\[/b start
/^$/b loop
x;p;g
}
p'
-n
означает по умолчанию ничего не печатать. :start
- это просто метка для последующего goto. Мы сопоставляем строки, начинающиеся с [
и начинаем группу ({...}) команд.
Мы копируем строку на место удержания (h). Получаем следующую строку (n). Если она
начинается с [
, то у нас был пустой участок, поэтому переходим (b) и начинаем снова.
Если строка пустая (/^$/), читаем другую строку (goto loop). Строка не пуста, поэтому мы меняем строку на заголовок секции (x), печатаем заголовок секции (p), получаем обратно текущую строку (g) и продолжаем из группы команд печатать (p) строку. Эта последняя команда (p) также печатает заголовки, не относящиеся к разделу.
У меня есть следующий awk
BEGIN { empty=0 ; section = "" ; }
substr($0,1,1) == "[" { section = $0 ; next ; }
NF == 0 { if ( empty++ ) print ; section = "" ; next ; }
NF > 0 { if ( section != "" ) print section ; print ; section = "" ; }
, который будет вызываться с
awk -f pgm.awk infile > outfile
, однако, как упоминает Тердон, лучше всего использовать библиотеку, этот формат файла не является конфиденциальным, кроме того, библиотека позаботится о cr
, cr / nl
и nl
конец строки.