Bunun için birçok araç var:
dd
bir dosyayı engellemek istiyorsanız kullanmak istediğiniz şeydir - yalnızca belirli sayıda baytı yalnızca belirli bir sayıda güvenilir bir şekilde okuyun. Dosya akışlarını engelleme ve engellemeyi kaldırmayı portatif olarak işler:
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
Ben de tr
yukarıdaki herhangi bir ASCII bayt başka bir dönüştürme (veya bu durumda, boşluk yazdırılamaz bir karakter olmayan herhangi bir ASCII bayt silme) işleyebilir çünkü yukarıda kullanın . Bu sabah diğer sorunuza cevap olarak kullandığım şey , aslında, bunu yaptığımda:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Orada birçok benzer . Bu liste, aşina olabileceğiniz en düşük ortak payda alt kümesini sağlamalıdır.
Ancak, 2.5 gbs ikili dosya üzerinde metin işleme yapacak olsaydım, başlayabilirim od
. Size başka bir octal dump
veya daha fazla format verebilir . Her türlü seçeneği belirtebilirsiniz - ancak her satırda yalnızca bir bayt \C
kaçış biçiminde yapacağım :
od
Aşağıdan gösterdiğim gibi , alacağınız veriler belirttiğiniz aralıkta düzenli olacaktır. Ama önce - sorunuzun cevabı burada:
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}'
Bu biraz yukarıda \n
ewlines, \0
nulls, \t
abs ve sınırlayıcı için kaçan dize <spaces>
korunurken sınırlar \C
. Kullanılan H
ve x
işlevlerine dikkat edin; her sed
bir sınırlayıcıyla karşılaştığında, bellek arabelleklerinin içeriğini değiştirir. Bu şekilde, sed
yalnızca dosyayı güvenilir bir şekilde sınırlamak için gerektiği kadar bilgi tutar ve arabellek taşmalarına boyun eğmez - yani aslında sınırlayıcılarıyla karşılaştığı sürece. Kadar uzun olduğu gibi için, sed
onun girişini işlenmeye devam edecek ve od
karşılaştığı kadar vermeye devam edecektir EOF
.
Olduğu gibi, çıktısı şöyle görünür:
first
\nnewline
\ttab
spacefoobar
\0null
Yani eğer istersem foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Eğer C
kaçışları kullanmak istiyorsanız, bu oldukça kolaydır - çünkü sed
zaten çift \\
ters eğik çizgi tüm tek giriş ters eğik çizgilerden kaçmıştır, bu nedenle printf
yürütülen xargs
özellik belirtiminize çıktı üreten herhangi bir sorun olmayacaktır. Ancak xargs
kabuk tırnaklarını yiyor, böylece tekrar iki kez alıntı yapmanız gerekecek:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Bu, bir kabuk değişkenine kolayca kaydedilebilir ve daha sonra aynı şekilde üretilebilir. Sonuncusu , girdisindeki her karakterden önce ters eğik çizgi sed
ekler \
ve hepsi bu.
Ve işte daha önce hiç olmadığı gibi görünüyor 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
Veya kullanımına açık mısınızpython
?