วิธีการพิมพ์แบบ sed ถึงจุดสิ้นสุดของบรรทัดจาก socat


1

ฉันมีเซิร์ฟเวอร์ที่ส่งข้อมูลในการออกอากาศ UDP บนพอร์ต 1,0552 ข้อมูลคือ 7 ตัวเลขคั่นด้วยเครื่องหมายจุลภาคดังนั้น

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

ฉันดึงข้อมูลนี้ด้วย

socat -u udp-recv:10552,reuseaddr -

ฉันต้องการเปลี่ยนรูปแบบของข้อมูลนี้ดังนั้นฉันจะทำให้เป็นข้อมูล ฉันไม่สนใจหมายเลขแรกดังนั้นฉันจึงลบออกด้วย

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 พร้อมกับ builtin Bash 3.2 มีอะไรอีกบ้างที่ฉันลองได้บ้าง

คำตอบ:


1

socat กำลังส่งคืนข้อมูลด้วย \r\n การสิ้นสุดบรรทัด เปลี่ยนแปลง

s/$/)/

ไปยัง

s/\r$/)/

นั่นอาจหรือไม่อาจทำงานกับ OSX sed


นั่นมัน! ขอบคุณ! OS X sed ไม่ชอบ carriage return แต่คุณสามารถใช้ GNU sed หรือนำหน้าคำสั่งด้วย $ sed $'s/\r$/)/'
user3397903

0

อีกทางเลือกหนึ่งในการลบ CR อย่างชัดเจนคือการบอก socat ว่าบรรทัดนั้นถูกยกเลิก CR NL:

 socat -u udp-recv:10552,reuseaddr,crnl - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;s/$/)/'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.