Ціле значення ASCII до символу в BASH за допомогою printf


84

Символ для оцінки робіт:

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

У мене є два запитання, перше найважливіше:

  • Як взяти 65 і перетворити в А?
  • \ 'A перетворює символ ASCII у його значення за допомогою printf. Синтаксис специфічний для printf або він використовується де-небудь ще в BASH? (Для таких невеликих рядків Google важко.)
bash  ascii  printf 

У Windows використовуйте ALT + 65 для друку символу ASCII - на жаль, це не буде працювати за допомогою Unix / bash;)
schnaader

2
@schnaader, але ви не можете це зробити.
ctrl-alt-delor

2
@richard: Помилка ... це непросто і не практично, але ви могли б :) "Просто" запустити віртуальну машину під управлінням Windows або MS-DOS, надіслати "echo", ALT, 6, 5, "> mysharedfolder \ file.txt" як натискання клавіш і читання файлу file.txt із спільної папки VM.
schnaader

2
@schnaader ти міг би для цього використовувати вино?
Еморі

Відповіді:


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 для отримання шістнадцяткових значень):

$ 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:

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

2
або в perl, надрукуйте chr (65), "\ n"; Хоча perl може бути гарним вибором, якщо ви робите багато цього, використання printf оболонки для перетворення вашого номера у щось, що може перейти в послідовність виходу \ 0, працює чудово. Складніше з унікодом, оскільки вам потрібна підтримка \ u у вашому printf.
Пітер Кордес,

На жаль, Perl - це забута мова. Кращим є Python, який зараз є майже на кожній машині Linux. Крім того, питання стосується Shell-Bash, а не інших платформ!
s3n0

7

Якщо ви хочете зберегти значення ASCII символу: (я зробив це в BASH, і це спрацювало)

{
char="A"

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

echo $testing}

вихід: 65


Це спрацювало, дякую. Я хотів отримати ціле число (код ASCII) з набраного символу. Я зробив сценарій: {read -n 1 c; echo $ (printf "% d" "'$ {c}")}
Федр

4

Якщо перетворити 65в шістнадцяткову, це 0x41:

$ echo -e "\x41" A


якщо ви знаєте шістнадцяткове значення для друку символу ASCII$ printf "\x41"
katta

4

Для великих літер:

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

Вихід:

C.

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

це друкує всі символи "для друку" базового налаштування bash:

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

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.