Wie man sed Druck bis zum Zeilenende von socat macht

621
user3397903

Ich habe einen Server, der Daten in einem UDP-Broadcast an Port 10552 sendet. Die Daten bestehen aus 7 Zahlen, die durch Kommas getrennt sind.

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

Ich hole diese Daten mit ab

socat -u udp-recv:10552,reuseaddr - 

Ich möchte das Format dieser Daten ändern, also leite ich es in sed. Die erste Nummer ist mir egal, also entferne ich sie mit

s/[^,]*,//; 

Ich füge nach den Kommas Leerzeichen mit ein

s/,/, /g 

Dann füge ich am Anfang jeder Zeile eine offene Klammer mit ein

 s/^/(/ 

Zum Schluss versuche ich, am Ende jeder Zeile eine enge Klammer hinzuzufügen

s/$/)/ 

Der letzte Befehl endet

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

Alles funktioniert wie erwartet, nur die letzte schließende Klammer endet am Anfang jeder Zeile, so dass es aussieht

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

Entfernen des letzten Bits des Befehls für

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

führt in

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

Ich habe versucht, das Ende der Zeile durch awk, tr und auch GNU sed zu ersetzen, aber alles scheint die Zeile oder etwas zu überlaufen.

Ich bin auf OS X 10.10.3 mit der eingebauten Bash 3.2. Kann ich noch etwas probieren?

1

2 Antworten auf die Frage

1
glenn jackman

socat gibt Daten mit \r\nZeilenenden zurück. Veränderung

s/$/)/ 

zu

s/\r$/)/ 

Das kann mit dem OSX sed funktionieren oder auch nicht

Das war's! Vielen Dank! OS X sed mag den Wagenrücklauf nicht, aber Sie können entweder GNU sed verwenden oder den Befehl mit einem $ voranstellen. `sed $ 's / \ r $ /) /'` user3397903 vor 9 Jahren 0
0
Thor

Eine Alternative zum expliziten Entfernen der CR ist, socatdass die Zeilen mit CR NL terminiert sind:

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