我正在尝试连接两行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 /'
Run Code Online (Sandbox Code Playgroud)
正则表达式在vim.
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)
在这种情况下,sed将header与line 1、paired 1与line 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根据内容连接行。
| 归档时间: |
|
| 查看次数: |
5187 次 |
| 最近记录: |