Ada banyak alat untuk ini:
ddadalah apa yang ingin Anda gunakan jika Anda ingin memblokir file - andal hanya baca sejumlah byte saja beberapa kali saja. Ini dengan mudah menangani memblokir dan membuka blokir aliran file:
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
Saya juga menggunakan di tratas karena dapat menangani konversi byte ASCII ke yang lain (atau, dalam hal ini, menghapus byte ASCII yang bukan karakter yang dapat dicetak tanpa spasi). Itulah yang saya gunakan untuk menjawab pertanyaan Anda yang lain pagi ini, pada kenyataannya, ketika saya melakukannya:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Ada banyak yang mirip . Daftar itu harus menyediakan subset common-denominator terendah yang dengannya Anda mungkin terbiasa.
Tapi, jika saya akan melakukan pemrosesan teks pada file biner 2.5gbs, saya mungkin mulai dengan od. Ini dapat memberi Anda octal dumpatau salah satu dari beberapa format lainnya. Anda dapat menentukan semua jenis opsi - tetapi saya hanya akan melakukan satu byte per baris dalam \Cformat yang diloloskan:
Data yang akan Anda dapatkan odakan teratur pada interval apa pun yang Anda tentukan - seperti yang saya tunjukkan di bawah ini. Tapi pertama-tama - inilah jawaban untuk pertanyaan Anda:
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}'
Itu sedikit di atas \nbatas pada garis, \0nol, \tabs dan <spaces>sambil mempertahankan \Cstring yang lolos untuk pembatas. Perhatikan Hdan xfungsi yang digunakan - setiap kali sedbertemu pembatas itu menukar isi buffer memorinya. Dengan cara ini sedhanya menyimpan informasi sebanyak yang diperlukan untuk membatasi file secara andal dan tidak menyerah pada buffer overruns - tidak, yaitu, asalkan itu benar-benar bertemu dengan pembatasnya. Selama itu terjadi, sedakan terus memproses inputnya dan odakan terus menyediakannya sampai bertemu EOF.
Seperti apa, outputnya terlihat seperti ini:
first
\nnewline
\ttab
spacefoobar
\0null
Jadi jika saya mau foobar:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Sekarang jika Anda ingin menggunakan Cpelarian itu cukup mudah - karena backslash sedsudah berlipat ganda \\lolos dari semua backslash input tunggal, jadi printfdari yang xargssudah ada tidak akan ada masalah menghasilkan output dengan spesifikasi Anda. Tetapi xargs makanlah kutipan shell sehingga Anda harus menggandakan penawaran itu lagi:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Itu bisa dengan mudah disimpan ke variabel shell dan output nanti dengan cara yang sama. Yang terakhir sedmenyisipkan \garis miring terbalik sebelum setiap karakter dalam inputnya, dan itu saja.
Dan inilah yang terlihat seperti sebelumnya 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
perlataupython?