Это портативное решение с POSIXsed
, реализующее следующие правила:
- пустые строки должны быть удалены;
- любая строка, начинающаяся с,
#S
должна быть объединена с предыдущей непустой строкой, с одним пробелом между ними, если нет предыдущей непустой строки.
Код:
<data sed '/^$/ d; :start; N; s/\n$//; t start; s/\n#S/ #S/; t start; P; D'
То же самое с комментариями (все еще рабочий код):
<data sed ' /^$/ d # If empty line read, delete it and start a new cycle. :start # A label. N # Read additional line, there are now two lines in the pattern space. s/\n$// # If the second line is empty, replace the newline with nothing. t start # If the above replacement occurred, go to start (to add another line). # Otherwise s/\n#S/ #S/ # if the second line starts with #S, replace the newline with space. t start # If the above replacement occurred, go to start (to add another line). # Otherwise # (i.e when non-empty line not starting with #S occurred) P # print the pattern space up to the first newline and... D # delete the initial segment of the pattern space # through the first newline (i.e. everything just printed), # and start the next cycle with the resultant pattern space # and without reading any new input # (in our case the new input will be explicitly read by N then). '
Обратите внимание, что решение использует sed
пространство шаблонов для накопления множества входных строк. Это замечание относится:
Пространство шаблона и места хранения должно содержать не менее 8192 байтов.
Непосредственно перед P
командой пространство шаблона содержит одну (относительно длинную) строку, предназначенную для печати, и одну (относительно короткую) строку ввода, а также новую строку между ними. Очевидно, это зависит от ваших данных, превышает ли такая структура 8192 байта в какой-то момент. Если это произойдет, некоторые sed
реализации могут потерпеть неудачу.