これには多くのツールがあります。
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バイトに変換する(または、この場合、非スペース印刷可能文字ではないASCIIバイトを削除する)処理ができるため、上記を使用します。今朝、あなたが行った他の質問への答えとして、私が実際に使用したものです。
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
多くの類似したものがあります。そのリストは、あなたがよく知っているかもしれない最も低い共通分母のサブセットを提供するはずです。
しかし、2.5ギガバイトのバイナリファイルでテキスト処理を行う場合は、から始めodます。octal dumpまたは他のいくつかの形式のいずれかを提供できます。あらゆる種類のオプションを指定できますが、\Cエスケープ形式で行ごとに1バイトだけを実行します。
取得するデータは、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}'
上記の少しは、\newlines、\0null、\tabsを区切り、区切り文字のエスケープ文字列<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すでに二重の\\バックスラッシュがその単一の入力バックスラッシュのすべてをエスケープしているので、printfexeced from 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ますか?