我有一个服务器,它在端口 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/$/)/'