Как сделать sed print до конца строки от socat

467
user3397903

У меня есть сервер, который отправляет данные в UDP Broadcast на порт 10552. Данные представляют собой 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

2 ответа на вопрос

1
glenn jackman

socat возвращает данные с \r\nокончаниями строк. + Изменить

s/$/)/ 

в

s/\r$/)/ 

Это может или не может работать с OSX Sed

Вот и все! Спасибо! OS X sed не любит возврат каретки, но вы можете использовать GNU sed или предварить команду символом $. `sed $ 's / \ r $ /) /'` user3397903 9 лет назад 0
0
Thor

Альтернативой явному удалению CR является сообщение о socatтом, что строки завершены CR NL:

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