อะไรคือsed
คาถาที่จะลบไบต์ null จากไฟล์หรือไม่? ฉันกำลังพยายาม:
s/\000//g
แต่นั่นคือการแยกสตริงของศูนย์
s/\x00//g
ดูเหมือนว่าจะไม่มีผลกระทบ ฉันพยายามทำสิ่งนี้ในsed
สคริปต์ดังนั้นฉันจึงไม่แน่ใจว่าecho
กลอุบายจะได้ผล
อะไรคือsed
คาถาที่จะลบไบต์ null จากไฟล์หรือไม่? ฉันกำลังพยายาม:
s/\000//g
แต่นั่นคือการแยกสตริงของศูนย์
s/\x00//g
ดูเหมือนว่าจะไม่มีผลกระทบ ฉันพยายามทำสิ่งนี้ในsed
สคริปต์ดังนั้นฉันจึงไม่แน่ใจว่าecho
กลอุบายจะได้ผล
คำตอบ:
ฉันไม่รู้ว่าคุณจะบรรลุสิ่งนี้ได้sed
อย่างไร แต่นี่เป็นวิธีแก้ปัญหาที่ใช้ได้กับtr
:
tr < file-with-nulls -d '\000' > file-without-nulls
นี่เป็นวิธีแก้ปัญหาสำหรับการsed
ทำงานในบางโอกาส แต่ไม่ใช่ทั้งหมด:
sed 's/\x0//g' file1 > file2
นี่เป็นวิธีแก้ปัญหาที่เกี่ยวข้องกับการแทนที่อักขระช่องว่างซึ่งควรทำงานในทุกโอกาส:
sed 's/\x0/ /g' file1 > file2
-i
พารามิเตอร์ในการแปลงไฟล์ให้อยู่กับที่
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
แก้จุดบกพร่องนี้
มันค่อนข้างง่ายในการใช้ 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
โดยการเรียกใช้
เพื่อให้ตรงกับ null null ฉันใช้ regex นี้กับ SED ของ Cygwin:
[^ \ x01- \ x7F]