如何让 sed 在 socat 中打印到行尾

如何让 sed 在 socat 中打印到行尾

我有一个服务器,它在端口 10552 上以 UDP 广播的形式发送数据。数据是用逗号分隔的 7 个数字。

5.351204,0.001968,-0.000473,-0.999222,0.000451,0.001455,1.084310

我使用以下方法获取数据

socat -u udp-recv:10552,reuseaddr -

我想更改此数据的格式,因此我将其导入 sed。我不关心第一个数字,因此我使用

s/[^,]*,//;

我在逗号后添加空格

s/,/, /g

然后我在每行开头添加一个左括号

 s/^/(/

最后,我尝试在每行末尾添加一个右括号

s/$/)/

最终的命令是

socat -u udp-recv:10552,reuseaddr - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;s/$/)/'

一切都按预期进行,除了最后的右括号位于每行的开头,因此看起来像

)0.051727, -0.595779, -0.794678, 0.082047, 0.644327, -0.027242

删除命令的最后一位

socat -u udp-recv:10552,reuseaddr - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;'

结果是

(0.079330, -0.608597, -0.786194, 0.092438, 0.657444, -0.031528

我曾尝试用 awk、tr 以及 GNU sed 替换行尾的附加,但一切似乎都溢出了行或出现了其他问题。

我使用的是 OS X 10.10.3,内置 Bash 3.2。我还可以尝试其他方法吗?

答案1

socat 返回带有\r\n行尾的数据。更改

s/$/)/

s/\r$/)/

这可能适用于 OSX sed

答案2

明确删除 CR 的另一种方法是告知socat行以 CR NL 终止:

 socat -u udp-recv:10552,reuseaddr,crnl - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;s/$/)/'

相关内容