इसके लिए कई उपकरण हैं:
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 ऊपर यही कारण है कि छोटा सा \newlines, \0Nulls, \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?