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
для объединения строк в соответствии с их содержанием.