อะไรคือ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]