प्रिंटर्स का उपयोग करके बीएचएएस में चरित्र के लिए एएसजीआईआरसीआई मान


84

मूल्य कार्यों के लिए चरित्र:

$ printf "%d\n" \'A
65
$ 

मेरे दो सवाल हैं, पहला सबसे महत्वपूर्ण:

  • मैं 65 कैसे ले सकता हूं और इसे ए में बदल दूंगा?
  • \ "A एक ASCII वर्ण को प्रिंटफ का उपयोग करके उसके मान में परिवर्तित करता है। क्या सिंटैक्स प्रिंटफ के लिए विशिष्ट है या क्या इसका उपयोग BASH में कहीं और किया जाता है? (ऐसे छोटे तार Google के लिए कठिन हैं।)
bash  ascii  printf 

Windows में, ASCII वर्ण को प्रिंट करने के लिए ALT + 65 का उपयोग करें - दुर्भाग्य से जो यूनिक्स / बैश का उपयोग करके काम नहीं करेगा;)
schnaader

2
@schnaader लेकिन आप उसे स्क्रिप्ट नहीं कर सकते।
ctrl-alt-delor-

2
@richard: इर्रर .. यह आसान या व्यावहारिक नहीं है, लेकिन आप :) "बस" एक वीएम रनिंग विंडोज या एमएस-डॉस शुरू कर सकते हैं, "इको", एएलटी, 6, 5, "> mysaredfolder \ file.txt" के रूप में भेजें यह करने के लिए keystrokes और VM साझा फ़ोल्डर से file.txt पढ़ें।
श्नाइडर

2
क्या आप शराब का इस्तेमाल कर सकते हैं?
एमोरी

जवाबों:


69

एक पंक्ति

printf "\x$(printf %x 65)"

दो लाइनें

set $(printf %x 65)
printf "\x$1"

यहाँ एक है अगर आप का उपयोग करने में कोई आपत्ति नहीं है awk

awk 'BEGIN{printf "%c", 65}'

3
साथ ही काम करना चाहिएprintf "$(printf '\\x%02x' $char)"
0andriy

31

यह काम करता है (अष्टक में मूल्य के साथ):

$ printf '%b' '\101'
A

यहां तक ​​कि (कुछ: 7 से अधिक नहीं) अनुक्रम:

$ printf '%b' '\'{101..107}
ABCDEFG

एक सामान्य निर्माण जो किसी भी सीमा में (दशमलव) मानों की अनुमति देता है:

$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

या आप वर्णों के हेक्स मान का उपयोग कर सकते हैं:

$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

आप xxd के साथ वर्ण वापस पा सकते हैं (हेक्साडेसिमल मानों का उपयोग करें):

$ echo "41" | xxd -p -r
A

अर्थात्, एक क्रिया दूसरे के विपरीत है:

$ printf "%x" "'A" | xxd -p -r
A

और एक साथ कई हेक्स मानों के साथ काम करता है:

$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ

या अनुक्रम (प्रिंट मान हेक्स मान प्राप्त करने के लिए यहाँ प्रयोग किया जाता है):

$ printf '%x' {65..90} | xxd -r -p 
ABCDEFGHIJKLMNOPQRSTUVWXYZ

या यहां तक ​​कि awk का उपयोग करें:

$ echo 65 | awk '{printf("%c",$1)}'
A

यहां तक ​​कि दृश्यों के लिए:

$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ

14

आपके दूसरे प्रश्न के लिए, ऐसा लगता है कि अग्रणी-उद्धरण वाक्यविन्यास ( \'A) के लिए विशिष्ट है printf:

यदि अग्रणी चरित्र एकल-उद्धरण या डबल-उद्धरण है, तो मूल्य एकल-उद्धरण या दोहरे-उद्धरण के बाद वर्ण के अंतर्निहित कोडसेट में संख्यात्मक मान होगा।

से http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html


9

एक विकल्प सीधे उस चरित्र को इनपुट करना है जिसे आप हेक्स या ऑक्टल नोटेशन का उपयोग करने में रुचि रखते हैं:

printf "\x41\n"
printf "\101\n"

8

इस तरह के रूपांतरण के लिए, मैं पर्ल का उपयोग करता हूं:

perl -e 'printf "%c\n", 65;'

2
या पर्ल में, प्रिंट chr (65), "\ n"; यदि आप बहुत कुछ कर रहे हैं, तो पर्ल एक अच्छा विकल्प हो सकता है, शेल के प्रिन्ट का उपयोग करके अपने नंबर को किसी ऐसी चीज़ में परिवर्तित करना, जो a \ 0 एस्केप अनुक्रम में जा सकती है, ठीक काम करती है। यूनिकोड के साथ अधिक जटिल, जैसा कि आपको अपने प्रिंट में \ u समर्थन की आवश्यकता है।
पीटर कॉर्डेस

दुर्भाग्य से, पर्ल एक भूल भाषा है। बेहतर है पायथन, जो अब लगभग हर लिनक्स मशीन में है। इसके अलावा, सवाल शेल-बैश और अन्य प्लेटफार्मों के बारे में नहीं है!
s3n0

7

यदि आप वर्ण का ASCII मान बचाना चाहते हैं: (मैंने यह BASH में किया था और इसने काम किया)

{
char="A"

testing=$( printf "%d" "'${char}" )

echo $testing}

आउटपुट: 65


यह काम किया, धन्यवाद। मैं टाइप किए गए चरित्र से एक इंटीजर (एएससीआईआई कोड) प्राप्त करना चाहता था। मैंने एक स्क्रिप्ट बनाई: {read -n 1 c; इको $ (प्रिंटफ "% d" "'$ {c}")}
फेद्रस


4

बड़े अक्षरों के लिए:

i=67
letters=({A..Z})
echo "${letters[$i-65]}"

आउटपुट:

सी

3

यहां 65 को A (ऑक्टल के माध्यम से) में बदलने का एक और तरीका है:

help printf  # in Bash
man bash | less -Ip '^[[:blank:]]*printf'

printf "%d\n" '"A'
printf "%d\n" "'A"

printf '%b\n' "$(printf '\%03o' 65)"

उपयोग के लिए खोज करने man bashके \'लिए (हालांकि इस मामले में निरर्थक):

man bash | less -Ip "\\\'"  # press <n> to go through the matches

1

यह आपके मूल बैश सेटअप के सभी "प्रिंट करने योग्य" अक्षरों को प्रिंट करता है:

printf '%b\n' $(printf '\\%03o' {30..127})

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.