如何用`sed`连接两行?

sce*_*ddy 4 sed pipe

我正在尝试连接两行iwlist输出。我的grepsed删除前导和尾随空格的命令工作正常,但我无法获得sed删除\n工作的最后一条语句。我错过了什么?

sudo iwlist wlan0 scanning |
   grep -e ESSID -e Signal |
   sed -e 's/^[ \t]*//;s/[ \t]*$//' |
   sed -e 's/dBm\n/dBm /'
Run Code Online (Sandbox Code Playgroud)

正则表达式在vim.

Kam*_*ski 5

sed是一个文本工具。默认情况下,它每一行输入输出一行输出。虽然将换行符注入到输出中很容易(使其更多行),但从输入中删除换行符并不容易,因为它们并不真正属于正在处理的行,而是将它们分开。

摘自info sed(强调我的):

sed通过对每一行输入执行以下循环来进行操作:首先,sed从输入流中读取一行,删除任何尾随换行符,并将其放入模式空间。然后执行命令;[…]。

然而有N

N
向模式空间添加一个换行符,然后将输入的下一行附加到模式空间。如果没有更多输入,则sed退出而不处理任何更多命令。

这允许您成对处理行,这就是您所需要的。像这样包含N在你的最后sed

sed -e 'N;s/dBm\n/dBm /'
Run Code Online (Sandbox Code Playgroud)

请注意,只有当整个输入逻辑上由您要逐对处理的行组成时,它才会起作用,即此逻辑结构是可以的:

line 1
paired 1
line 2
paired 2
…
Run Code Online (Sandbox Code Playgroud)

而这个不是:

header
line 1
paired 1
line 2
paired 2
…
Run Code Online (Sandbox Code Playgroud)

在这种情况下,sedheaderline 1paired 1line 2等配对,违反您的逻辑。另一个不好的例子:

line 1
paired 1
excessive line
line 2
paired 2
…
Run Code Online (Sandbox Code Playgroud)

excessive line会以配对line 2。这将打破连续对的逻辑。

所以你必须小心。另一方面,如果只有行配对正确,您不必担心要替换哪些换行符,因为无论如何您都无法更改分隔对的换行符。出于这个原因dBm,现在完全不需要包含在您的模式中。你的最后一个sed也可能是:

sed -e 'N;s/\n/ /'
Run Code Online (Sandbox Code Playgroud)

如果您需要更复杂的逻辑,请参阅此答案。它用于sed根据内容连接行。