วิธีการใช้ sed เพื่อลบไบต์ว่าง?


37

อะไรคือsedคาถาที่จะลบไบต์ null จากไฟล์หรือไม่? ฉันกำลังพยายาม:

s/\000//g

แต่นั่นคือการแยกสตริงของศูนย์

s/\x00//g

ดูเหมือนว่าจะไม่มีผลกระทบ ฉันพยายามทำสิ่งนี้ในsedสคริปต์ดังนั้นฉันจึงไม่แน่ใจว่าechoกลอุบายจะได้ผล

คำตอบ:


40

ฉันไม่รู้ว่าคุณจะบรรลุสิ่งนี้ได้sedอย่างไร แต่นี่เป็นวิธีแก้ปัญหาที่ใช้ได้กับtr:

tr < file-with-nulls -d '\000' > file-without-nulls

นี่เป็นวิธีแก้ปัญหาสำหรับการsedทำงานในบางโอกาส แต่ไม่ใช่ทั้งหมด:

sed 's/\x0//g' file1 > file2

นี่เป็นวิธีแก้ปัญหาที่เกี่ยวข้องกับการแทนที่อักขระช่องว่างซึ่งควรทำงานในทุกโอกาส:

sed 's/\x0/ /g' file1 > file2

10
ที่ดูเหมือนคำตอบที่ไม่สมบูรณ์มาก เหตุใดจึงใช้งานได้ในบางโอกาสและไม่ใช่ผู้อื่นและหากเป็นเช่นนั้นตัวอย่างจะไม่มีประโยชน์
barlop

@barlop: เพราะวิธีการใช้งานหรือไม่ สหกรณ์ไม่ได้ระบุอย่างใดอย่างหนึ่งและฉันจะไม่ให้ระบุทุกการดำเนินงานเดียว ...
Tamara Wijsman

4
ถ้าอย่างนั้นฟังดูดีสำหรับฉันคุณกำลังบอกว่ามันขึ้นอยู่กับการใช้งาน SED หากคุณไม่ได้บอกว่าคุณเปิดทิ้งไว้ให้เปิดข้อเสนอแนะที่เป็นไปได้ว่าการนำ SED ไปใช้อาจลบ null จากไฟล์หนึ่งและไม่ใช่ไฟล์อื่นขึ้นอยู่กับข้อมูลในไฟล์
barlop

3
ไม่ควรเป็น "tr -d '\ 000' <file-with-nulls> file-without-nulls" หรือไม่
เชมัสอับส์

1
ใช้งานได้กับฉัน™ มีประโยชน์ด้วย: -iพารามิเตอร์ในการแปลงไฟล์ให้อยู่กับที่
zbyszek

8

trสะดุดมากกว่าไบต์อื่น ๆ ในไฟล์ของฉันและsedไม่ได้แทนที่อะไรเลย ฉันสิ้นสุดการทำมันไม่ได้อยู่ในsedแต่ใน Python:

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("\0", '')

นี่คือซับแบบหนึ่งที่สามารถไพพ์ได้ :

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'

ฉันยังสังเกตเห็นคำสั่งบางคำสั่งให้ปล่อยว่างไว้ที่นั่น แต่พวกเขาไม่สามารถมองเห็นได้อีกอย่างน้อยก็ไม่ได้อยู่ใน terminal OSX ฉันเคยhexdumpแก้จุดบกพร่องนี้


3

มันค่อนข้างง่ายในการใช้ Perl เพื่อดำเนินการ regex เพียงแทนที่sedด้วยperl -np -e:

$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two

ด้วย-nตัวเลือก regexes จะถูกเรียกใช้ทีละบรรทัดเช่นเดียวกับ sed

ถ้าคุณต้องการใช้ศูนย์ไบต์เป็นตัวคั่นเรกคอร์ดใช้-0ตัวเลือกของ Perl

$ printf 'one\0two\0' | perl -np0 -e 's/^/prefix /; s/\0/\n/g'
prefix one
prefix two
$ printf 'one\0two\0' | perl -np -e 's/^/prefix /; s/\0/\n/g'
prefix one
two

คุณสามารถดูตัวเลือกบรรทัดคำสั่งของ Perl perldoc perlrunโดยการเรียกใช้


1

เพื่อให้ตรงกับ null null ฉันใช้ regex นี้กับ SED ของ Cygwin:

[^ \ x01- \ x7F]


นี่คือคำตอบสำหรับคำถามสำหรับ sed ใน GNUWin32 จริง ๆ แล้วมันเป็นมากกว่าโมฆะ อาจหรืออาจไม่เหมาะกับคุณขึ้นอยู่กับสิ่งที่คุณต้องการจับคู่และการนำไปปฏิบัติ
Itsme2003
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.