इसके लिए कई उपकरण हैं:
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 बाइट को हटाने के लिए जो एक नहीं-जगह मुद्रण योग्य चरित्र नहीं है)। यह वही है जो मैंने आज सुबह आपके अन्य प्रश्न के उत्तर में इस्तेमाल किया है, वास्तव में, जब मैंने किया था:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
कर रहे हैं इसी तरह के कई । उस सूची को एक न्यूनतम सामान्य-भाजक सबसेट प्रदान करना चाहिए, जिसके साथ आप परिचित हो सकते हैं।
लेकिन, अगर मैं द्विआधारी फ़ाइल के 2.5 ग्राम पर पाठ प्रसंस्करण करने जा रहा था, तो मैं इसके साथ शुरू कर सकता हूं od
। यह आपको octal dump
या कई अन्य स्वरूपों में से एक दे सकता है। आप सभी प्रकार के विकल्पों को निर्दिष्ट कर सकते हैं - लेकिन मैं \C
बच गए प्रारूप में प्रति पंक्ति केवल एक बाइट करूंगा :
आपके द्वारा प्राप्त किया गया डेटा आपके द्वारा 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}'
पर delimits ऊपर यही कारण है कि छोटा सा \n
ewlines, \0
Nulls, \t
पेट और <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
पहले से ही डबल \\
बैकस्लैश अपने सभी सिंगल इनपुट बैकस्लैश से बच गया है, इसलिए printf
निष्पादित से 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
?