sed
- это текстовый инструмент. По умолчанию он выводит одну строку вывода на одну строку ввода. Несмотря на то, что легко вставить новые строки в вывод (делая их больше строк), не так просто избавиться от новых строк из ввода, потому что они на самом деле не относятся к обрабатываемым строкам, они разделяют их.
Выдержка из info sed
(выделено мной):
sed
работает, выполняя следующий цикл для каждой строки ввода: во-первых, sed
читает одну строку из входного потока, удаляет все завершающие символы новой строки и помещает ее в пространство шаблона. Затем команды выполняются; [...].
Однако есть N
:
N
Добавьте новую строку в пространство шаблона, затем добавьте следующую строку ввода в пространство шаблона. Если входных данных больше нет, sed
выходит без обработки каких-либо команд.
Это позволяет обрабатывать строки попарно, это то, что вам нужно. Включите N
в свой последний sed
как это:
sed -e 'N;s/dBm\n/dBm /'
Обратите внимание, что это будет работать только в том случае, если весь вход логически состоит из строк, которые вы хотите обрабатывать пара за парой, т.е. эта логическая структура в порядке:
line 1
paired 1
line 2
paired 2
…
пока этого нет
header
line 1
paired 1
line 2
paired 2
…
В этом случае sed
будет связывать header
со line 1
, paired 1
со line 2
и т.д., В соответствии с вашей логикой. Еще один плохой пример:
line 1
paired 1
excessive line
line 2
paired 2
…
excessive line
будет соединена со line 2
. Это нарушит логику последовательных пар.
Поэтому вы должны быть осторожны. С другой стороны, если правильно спарены только линии, вам не нужно беспокоиться о том, какие новые строки вы заменяете, потому что вы все равно не можете изменить те, которые разделяют пары. По этой причине включение dBm
в ваш паттерн теперь совершенно не нужно. Ваш последний sed
может также быть:
sed -e 'N;s/\n/ /'
Если вам когда-нибудь понадобится более сложная логика, посмотрите этот ответ. Он использует sed
для объединения строк в соответствии с их содержанием.