我正在尝试连接两行输出iwlist
。我的grep
andsed
命令可以删除前导和尾随空格,但我无法使用最后一个sed
语句删除\n
to。我遗漏了什么?
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
…
在这种情况下,sed
将header
与line 1
、paired 1
withline 2
等配对,这违背了你的逻辑。另一个不好的例子:
line 1
paired 1
excessive line
line 2
paired 2
…
将excessive line
与 配对line 2
。这将破坏连续配对的逻辑。
所以你必须小心。另一方面,如果行与行的配对正确,你不必担心要替换哪些换行符,因为无论如何你都无法改变分隔行的换行符。因此,dBm
现在在你的模式中包含这些换行符完全没有必要。你最后的做法sed
可能是:
sed -e 'N;s/\n/ /'
如果您需要更复杂的逻辑,请参阅这个答案. 它用于sed
根据内容连接行。