Это довольно просто сделать с помощью sed.Рассмотрим файл ниже
$ cat numbered
1 abc
def
ghi
2 jkl
mno
3 pqr
4 stu
vxw
Команда sed '/^[0-9]/{N; s/\n/ /;}' numbered
выполнит трюк:
$ sed '/^[0-9]/{N; s/\n/ /;}' numbered
1 abc def
ghi
2 jkl mno
3 pqr 4 stu
vxw
Как это работает: сначала проверяется, начинается ли текущая строка с цифры:
/^[0-9]/
/^[0-9]/
является адресом и соответствует только строкам, начинающимся с цифры.Если какая-либо строка соответствует ей, команда, следующая за адресом, будет выполнена.
В этом случае это команда {
, которая открывает список функций.Список функций объединит две или более команд, как если бы они были только одной.В этом случае у нас есть две команды в списке функций.Первая - это команда N
:
N
Эта команда добавляет новую строку и следующую строку в пространство шаблона.Следующая строка больше не будет рассматриваться после текущего цикла.Следующая команда - s///
, которая заменяет символы новой строки пробелом:
s/\n/ /
Таким образом, символ новой строки, добавленный N
, будет заменен пробелом.Затем нам нужно просто закрыть список функций с помощью }
.Результат будет:
/^[0-9]/{
N
s/\n/ /
}
Поскольку для краткости я поместил все команды в одну строку, команды внутри списка функций должны быть разделены точками с запятой:
/^[0-9]/{N;s/\n/ /;}
Обратите внимание, чтоесли строка, начинающаяся с цифры, следует за другой строкой, начинающейся с цифры, следующая строка будет присоединена к предыдущей и к ней будет применена команда.