มีเครื่องมือมากมายสำหรับสิ่งนี้:
dd
คือสิ่งที่คุณต้องการใช้หากคุณต้องการปิดกั้นไฟล์ - อ่านได้อย่างน่าเชื่อถือจำนวนไบต์ที่แน่นอนเท่านั้นในบางครั้ง มันจัดการการบล็อกและการยกเลิกการบล็อกกระแสไฟล์แบบพกพา:
tr -dc '[:graph:]' </dev/urandom |
dd bs=32 count=1 cbs=8 conv=unblock,sync 2>/dev/null
###OUTPUT###
UI(#Q5\e
BKX2?A:Z
RAxGm:qv
t!;/v!)N
ฉันยังใช้tr
ด้านบนเนื่องจากสามารถจัดการการแปลง ASCII ใด ๆ เป็นอื่น ๆ (หรือในกรณีนี้การลบไบต์ ASCII ใด ๆ ที่ไม่ใช่อักขระที่ไม่สามารถพิมพ์ได้) เป็นสิ่งที่ฉันใช้ในการตอบคำถามอื่นของคุณเมื่อเช้านี้จริง ๆ แล้วเมื่อฉัน:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
มีหลายคนที่คล้ายกัน รายการดังกล่าวควรมีชุดย่อยของตัวหารร่วมที่ต่ำที่สุดซึ่งคุณอาจคุ้นเคย
แต่ถ้าผมจะทำการประมวลผลข้อความบน 2.5gbs od
ของไฟล์ไบนารีผมอาจจะเริ่มต้นด้วย สามารถให้octal dump
รูปแบบอื่น ๆ หรือหลายรูปแบบ คุณสามารถระบุตัวเลือกทุกประเภท - แต่ฉันจะทำเพียงหนึ่งไบต์ต่อบรรทัดใน\C
รูปแบบที่หลีกเลี่ยง:
ข้อมูลที่คุณจะได้รับod
จะเป็นข้อมูลปกติตามช่วงเวลาที่คุณระบุ - ตามที่ฉันแสดงด้านล่าง แต่ก่อนอื่น - นี่คือคำตอบสำหรับคำถามของคุณ:
printf 'first\nnewline\ttab spacefoobar\0null' |
od -A n -t c -v -w1 |
sed 's/^ \{1,3\}//;s/\\$/&&/;/ /bd
/\\[0nt]/!{H;$!d};{:d
x;s/\n//g}'
นั่นเล็กน้อยเหนือ delimits บน\n
ewlines, \0
nulls, \t
abs และ<spaces>
ในขณะที่การรักษา\C
สตริงหนีสำหรับตัวคั่น จดบันทึกH
และx
ใช้ฟังก์ชั่น - ทุกครั้งที่sed
พบตัวคั่นมันจะสลับเนื้อหาของบัฟเฟอร์หน่วยความจำออก ด้วยวิธีนี้sed
จะเก็บข้อมูลได้มากเท่าที่จะต้องกำหนดขอบเขตไฟล์อย่างน่าเชื่อถือและไม่ยอมให้บัฟเฟอร์โอเวอร์รัน - ไม่นั่นคือตราบใดที่มันพบตัวคั่น สำหรับตราบใดที่มันไม่sed
จะยังคงดำเนินการป้อนข้อมูลและจะยังคงให้มันจนกว่าจะพบod
EOF
ตามที่เป็นเอาท์พุทมันจะเป็นแบบนี้:
first
\nnewline
\ttab
spacefoobar
\0null
ดังนั้นถ้าฉันต้องการfoobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
ตอนนี้ถ้าคุณต้องการใช้ประโยชน์จากการC
หลบหนีมันค่อนข้างง่าย - เพราะsed
มี\\
แบ็กสแลชสองเท่าแล้วจึงหลบหนีแบ็กสแลชอินพุตเดี่ยวทั้งหมดดังนั้นการดำเนินการprintf
จากxargs
จะไม่มีปัญหาในการสร้างเอาต์พุตตามข้อกำหนดของคุณ แต่xargs
กินอัญประกาศเชลล์ดังนั้นคุณจะต้องเพิ่มราคาเป็นสองเท่า:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
ที่สามารถบันทึกได้อย่างง่ายดายในตัวแปรเชลล์และส่งออกในภายหลังในรูปแบบที่เหมือนกัน สุดท้ายsed
แทรก\
แบ็กสแลชต่อหน้าอักขระทุกตัวในอินพุตและนั่นคือทั้งหมด
และนี่คือสิ่งที่ดูเหมือนทุกครั้งที่เคยsed
มีมา:
printf 'nl\ntab\tspace foobarfoobar\0null' |
od -A n -t c -v -w1
n
l
\n
t
a
b
\t
s
p
a
c
e
f
o
o
b
a
r
f
o
o
b
a
r
\0
n
u
l
l
perl
หรือpython
ไม่?