Bunun için birçok araç var:
ddbir 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 tryukarı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 dumpveya daha fazla format verebilir . Her türlü seçeneği belirtebilirsiniz - ancak her satırda yalnızca bir bayt \Ckaçış biçiminde yapacağım :
odAş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 \newlines, \0nulls, \tabs ve sınırlayıcı için kaçan dize <spaces>korunurken sınırlar \C. Kullanılan Hve xişlevlerine dikkat edin; her sedbir sınırlayıcıyla karşılaştığında, bellek arabelleklerinin içeriğini değiştirir. Bu şekilde, sedyalnı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, sedonun girişini işlenmeye devam edecek ve odkarşı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 Ckaçışları kullanmak istiyorsanız, bu oldukça kolaydır - çünkü sedzaten çift \\ters eğik çizgi tüm tek giriş ters eğik çizgilerden kaçmıştır, bu nedenle printfyü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 sedekler \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
perlVeya kullanımına açık mısınızpython?