Ascii चरित्र के लिए दशमलव मुद्रण, मेरा आदेश के रूप में उत्पादन नहीं करता है


14

मैं निम्नलिखित आदेश के साथ सभी ascii वर्णों की एक स्ट्रिंग का उत्पादन करना चाहता था

for i in `seq 32 127`; do printf "%c" $i; done

उपरोक्त कमांड का आउटपुट है:

33333334444444444555555555566666666667777777777..............

यह प्रत्येक संख्या का पहला (बाएं से) अंक है।

इस साइट के माध्यम से देख कर मुझे अपनी समस्या का उत्तर मिला कि CLI में सभी मुद्रण योग्य ASCII चार्ट कैसे प्रिंट करें? , हालांकि मुझे अभी भी समझ में नहीं आया कि मेरा मूल स्निपेट एएससीआई के पात्रों का उत्पादन क्यों नहीं करता है।


1
POSIX यह तय करता है, यहां एक comp.unix.shellधागा है कि यह सही चीज क्यों है;)
sr_

@sr_ धागे को इंगित करने के लिए धन्यवाद। इसका स्पष्टीकरण मुझे तलाश था।
इफ्तिखान

जवाबों:


13

आप printf "%c" $iसी में जैसे का उपयोग करके सीधे एससीआई कोड प्रिंट नहीं कर सकते ।

आप पहली बार के लिए है अपने ऑक्टल मान में मैं के दशमलव मान परिवर्तित और फिर आप इसे का उपयोग का उपयोग कर मुद्रित करने के लिए है printfऔर डाल \उनके संबंधित अष्टाधारी मूल्यों के सामने।

मुद्रित करने के लिए A, आपको दशमलव 65 को अष्टक में बदलना होगा, अर्थात 101, और फिर आपको उस अष्टक मूल्य को इस प्रकार प्रिंट करना होगा:

printf "\101\n"

यह छपेगा A

तो आपको इसे संशोधित करना होगा:

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

लेकिन awkआप का उपयोग करके सीधे सी भाषा में प्रिंट कर सकते हैं

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo

7
में bashऔर zshयह लूप के बिना और बाहरी कमांड के बिना किया जा सकता है printf $(printf '\%o' {32..127}):।
manatwork

@manatwork: फिर यह उनका कहना है के लिए एक बहुत exactly..thanks ..
pradeepchhetri

1
@pradeepchhetri: विस्तृत प्रतिक्रिया के लिए धन्यवाद और यह अधिकांश आवश्यक विवरणों को कवर करने के लिए लगा (इसलिए मैं आपका उत्तर चुनता हूं)। हालाँकि मुझे लगता है कि यह एक महत्वपूर्ण जानकारी है जो निम्नलिखित संदेश में unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-07/… पर देखी जा सकती है । इसमें कहा गया है कि "तर्क परिचालनों को तार के रूप में माना जाएगा यदि संबंधित रूपांतरण विनिर्देशक b, c या s है ..."
इफ्तिखान

(char)(127)इस तरह से बैकस्पेस या कुछ नहीं है। जो कुछ भी है, वह हेक्स-बॉक्स में से एक के रूप में प्रकट होता है या जिसे वे कहते हैं। यदि आप केवल "मुद्रण योग्य" (यानी पठनीय) चाहते हैं, तो बस 126 पर जाएं। साथ ही, ऑक्टल के साथ अच्छा विचार किया। यह चालाकी है; मैं हेक्साडेसिमल (जैसे printf '\x%x; {32..126}... या 127 के संदर्भ में सोच रहा था , मुझे लगता है, क्योंकि आप सभी ने ऐसा किया था), लेकिन यह काम नहीं करता है। अष्टमी को दिन बचता है! :) अंत में, @ इफ्तिखान, मुझे यकीन नहीं है कि आपका क्या मतलब है। awkअक्सर सी-स्टाइल कमांड का उपयोग करता है और कहीं और %cउपयोग नहीं किया जाता है। ऑक्टल नंबरों का उपयोग करना एक-बाइट वर्णों का उपयोग करने से अलग है।
डायलन

3

%c संबंधित तर्क को चार के रूप में व्याख्या करता है: किसी दिए गए तर्क का केवल पहला वर्ण मुद्रित होता है

आपको लगता है कि पहले से ही उन्हें मुद्रित करने का एक तरीका है, लेकिन यहां एक संस्करण है।

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done

0

आपको जरूरत है printf, लेकिन केवल एक बार; आप printfसरल और अधिक कुशल echoप्लस बैश एस्केप अनुक्रमों के एक उपयोग को बदल सकते हैं:

हेक्सागेसिमल्स के साथ:

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

अष्टक के साथ:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.