Как объединить две строки с помощью `sed`?

709
sceddy

Я пытаюсь объединить две строки 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.

2
Пожалуйста, посмотрите на: [Что я должен делать, когда кто-то отвечает на мой вопрос?] (Http://superuser.com/help/someone-answers) Cyrus 6 лет назад 0

1 ответ на вопрос

2
Kamil Maciorowski

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