Có nhiều công cụ cho việc này:
dd
là những gì bạn muốn sử dụng nếu bạn muốn chặn một tệp - chỉ đọc một số byte nhất định trong một số lần nhất định. Nó có thể xử lý chặn và bỏ chặn các luồng tệp:
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
Tôi cũng sử dụng tr
ở trên vì nó có thể xử lý chuyển đổi bất kỳ byte ASCII nào sang bất kỳ byte nào khác (hoặc, trong trường hợp này, xóa bất kỳ byte ASCII nào không phải là ký tự có thể in không gian). Đó là những gì tôi đã sử dụng để trả lời cho câu hỏi khác của bạn sáng nay, trên thực tế, khi tôi đã làm:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Có nhiều cái tương tự . Danh sách đó sẽ cung cấp một tập hợp mẫu số chung thấp nhất mà bạn có thể làm quen.
Nhưng, nếu tôi định xử lý văn bản trên 2,5gbs tệp nhị phân, tôi có thể bắt đầu với od
. Nó có thể cung cấp cho bạn một octal dump
hoặc bất kỳ định dạng nào khác. Bạn có thể chỉ định tất cả các loại tùy chọn - nhưng tôi sẽ chỉ thực hiện một byte trên mỗi dòng theo \C
định dạng thoát:
Dữ liệu bạn sẽ nhận được từ od
sẽ đều đặn ở bất kỳ khoảng thời gian nào bạn chỉ định - như tôi hiển thị bên dưới. Nhưng trước tiên - đây là câu trả lời cho câu hỏi của bạn:
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}'
Đó là một chút trên các phân định trên \n
ewlines, \0
null, \t
abs và <spaces>
trong khi bảo tồn \C
chuỗi thoát cho dấu phân cách. Lưu ý H
và các x
chức năng được sử dụng - mỗi khi sed
gặp một dấu phân cách, nó sẽ hoán đổi nội dung của bộ đệm bộ nhớ. Theo cách nàysed
chỉ giữ lại nhiều thông tin nhất định để phân định tệp một cách đáng tin cậy và không chịu thua bộ đệm tràn ngập - không, nghĩa là, miễn là nó thực sự gặp các dấu phân cách của nó. Trong bao lâu, nó sed
sẽ tiếp tục xử lý đầu vào của nó và od
sẽ tiếp tục cung cấp cho đến khi nó gặp phải EOF
.
Như là, đầu ra của nó trông như thế này:
first
\nnewline
\ttab
spacefoobar
\0null
Vì vậy, nếu tôi muốn foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Bây giờ nếu bạn muốn sử dụng các C
lối thoát thì khá dễ dàng - vì sed
đã có \\
dấu gạch chéo ngược kép thoát khỏi tất cả các dấu gạch chéo đầu vào duy nhất của nó, do đó, việc thực printf
thi xargs
sẽ không có vấn đề gì tạo ra đầu ra cho đặc tả của bạn. Nhưng xargs
ăn báo giá vỏ nên bạn sẽ cần phải trích dẫn lại lần nữa:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Điều đó có thể dễ dàng được lưu vào một biến shell và xuất ra sau đó theo cách giống hệt nhau. Cuối cùngsed
chèn một \
dấu gạch chéo ngược trước mỗi ký tự trong đầu vào của nó, và đó là tất cả.
Và đây là tất cả những gì nó trông giống như trước đây từng sed
nắm giữ nó:
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
haypython
?