2

Я пытаюсь объединить две строки вывода iwlist . Мои команды grep и sed для удаления начальных и конечных пробелов работают нормально, но я не могу заставить последний оператор sed удалить \n для работы. Что мне не хватает?

sudo iwlist wlan0 scanning |
   grep -e ESSID -e Signal |
   sed -e 's/^[ \t]*//;s/[ \t]*$//' |
   sed -e 's/dBm\n/dBm /'

Регулярное выражение прекрасно работает в vim .

1 ответ1

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .