প্রিন্টফ ব্যবহার করে BASH তে অক্ষরের জন্য পূর্ণসংখ্যার ASCII মান


85

কাজের জন্য চরিত্র:

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

আমার দুটি প্রশ্ন রয়েছে, প্রথমটি সবচেয়ে গুরুত্বপূর্ণ:

  • আমি কীভাবে 65 নেব এবং এটিকে এ তে পরিণত করব?
  • A 'একটি প্রিন্টফ ব্যবহার করে একটি ASCII অক্ষরকে এর মানতে রূপান্তর করে। সিনট্যাক্স হল নির্দিষ্ট করতে printf অথবা এটি ব্যাশে কোথাও ব্যবহার করা হয়? (এই জাতীয় ছোট স্ট্রিং গুগলের পক্ষে শক্ত।
bash  ascii  printf 

উইন্ডোজে, ASCII চরিত্রটি মুদ্রণের জন্য ALT + 65 ব্যবহার করুন - দুর্ভাগ্যক্রমে এটি ইউনিক্স / ব্যাশ ব্যবহার করে কাজ করবে না;)
স্কেনাডার

4
@ schnaader কিন্তু আপনি এটি স্ক্রিপ্ট করতে পারবেন না।
ctrl-alt-delor

4
@রিচার্ড: এরর .. এটি সহজ বা বাস্তব নয়, তবে আপনি :) "জাস্ট" একটি উইন্ডোজ বা এমএস-ডস চালিত কোনও ভিএম শুরু করতে পারেন, "প্রতিধ্বনি", এএলটি,,, ৫, "> মাইশেডফোল্ডার \ file.txt" হিসাবে পাঠিয়েছিলেন এটিতে কীস্ট্রোক হয় এবং ভিএম শেয়ার্ড ফোল্ডার থেকে file.txt পড়ে।
schnaader

4
@ স্কনাডার আপনি কি এটির জন্য ওয়াইন ব্যবহার করতে পারেন?
এমুরি

উত্তর:


70

এক লাইন

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

দুটি লাইন

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

আপনি যদি ব্যবহার করতে আপত্তি না করেন তবে এখানে একটি awk

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

4
পাশাপাশি কাজ করা উচিতprintf "$(printf '\\x%02x' $char)"
ইন্দ্রিয়

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

বা এমনকি জোর করে ব্যবহার করুন:

$ 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;'

4
বা পার্লে, chr (65) মুদ্রণ করুন, "\ n"; পার্ল একটি ভাল পছন্দ হতে পারে আপনি যদি এটি অনেক কিছু করে থাকেন তবে শেল এর প্রিন্টফ ব্যবহার করে আপনার নম্বরটি এমন কিছুতে রূপান্তর করতে পারেন যা \ 0 এ্যাস্কেপ সিকোয়েন্সে যেতে পারে ঠিক কাজ করে। ইউনিকোড সহ আরও জটিল, আপনার প্রিন্টফায় আপনাকে সমর্থন দরকার।
পিটার কর্ডস

দুর্ভাগ্যক্রমে, পার্ল একটি ভুলে যাওয়া ভাষা। পাইথন সবচেয়ে ভাল যা এখন প্রায় প্রতিটি লিনাক্স মেশিনে রয়েছে। এছাড়াও, প্রশ্নটি শেল-বাশ সম্পর্কে এবং অন্যান্য প্ল্যাটফর্মগুলি নয়!
s3n0

7

আপনি যদি চরিত্রের ASCII মান সংরক্ষণ করতে চান: (আমি এটি বেসে করেছি এবং এটি কাজ করেছে)

{
char="A"

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

echo $testing}

আউটপুট: 65


ধন্যবাদ, ধন্যবাদ। আমি একটি টাইপ করা চরিত্র থেকে পূর্ণসংখ্যার (ASCII কোড) পেতে চেয়েছিলাম। আমি একটি স্ক্রিপ্ট তৈরি করেছি: {পড়ুন -1 1 সি; প্রতিধ্বনি $ (প্রিন্টফ "% d" "'$ {সি}")}
ফেইডরাস


4

বড় হাতের অক্ষরের জন্য:

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

আউটপুট:


3

65 কে এ (অক্টোটালের মাধ্যমে) রূপান্তর করার আরও একটি উপায় এখানে রয়েছে:

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{|}~

0

এখানে ইওল বা $ () বা ` without ছাড়াই একটি সমাধান রয়েছে :

ord () {
 local s
 printf -v s '\\%03o' $1
 printf "$s"
}

ord 65
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.