如何用 `sed` 连接两行?

如何用 `sed` 连接两行?

我正在尝试连接两行输出iwlist。我的grepandsed命令可以删除前导和尾随空格,但我无法使用最后一个sed语句删除\nto。我遗漏了什么?

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

正则表达式在 中运行良好vim

答案1

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

在这种情况下,sedheaderline 1paired 1withline 2等配对,这违背了你的逻辑。另一个不好的例子:

line 1
paired 1
excessive line
line 2
paired 2

excessive line与 配对line 2。这将破坏连续配对的逻辑。

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

sed -e 'N;s/\n/ /'

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

相关内容