Charakter do wartości działa:
$ printf "%d\n" \'A
65
$
Mam dwa pytania, najważniejsze jest pierwsze:
- Jak wziąć 65 i zamienić go na A?
- \ 'A konwertuje znak ASCII na jego wartość za pomocą printf. Czy składnia jest specyficzna dla printf, czy jest używana gdziekolwiek indziej w BASH? (Takie małe ciągi są trudne dla Google).
Odpowiedzi:
Jedna linia
printf "\x$(printf %x 65)"
Dwie linie
set $(printf %x 65) printf "\x$1"
Oto jeden, jeśli nie masz nic przeciwko używaniu
awk
awk 'BEGIN{printf "%c", 65}'
źródło
printf "$(printf '\\x%02x' $char)"
To działa (z wartością ósemkową):
$ printf '%b' '\101' A
nawet dla (niektórych: nie przekraczaj 7) sekwencji:
$ printf '%b' '\'{101..107} ABCDEFG
Ogólna konstrukcja, która dopuszcza (dziesiętne) wartości w dowolnym zakresie, to:
$ printf '%b' $(printf '\\%03o' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Lub możesz użyć wartości szesnastkowych znaków:
$ printf '%b' $(printf '\\x%x' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Możesz również odzyskać znak za pomocą xxd (użyj wartości szesnastkowych):
$ echo "41" | xxd -p -r A
Oznacza to, że jedno działanie jest odwrotnością drugiego:
$ printf "%x" "'A" | xxd -p -r A
Działa również z kilkoma wartościami szesnastkowymi jednocześnie:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r ABCDEFGHIJ
lub sekwencje (printf służy tutaj do uzyskania wartości szesnastkowych):
$ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ
Lub nawet użyj awk:
$ echo 65 | awk '{printf("%c",$1)}' A
nawet dla sekwencji:
$ seq 65 90 | awk '{printf("%c",$1)}' ABCDEFGHIJKLMNOPQRSTUVWXYZ
źródło
W przypadku drugiego pytania składnia cudzysłowu wiodącego (
\'A
) jest specyficzna dlaprintf
:Z http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
źródło
Jedną z opcji jest bezpośrednie wprowadzenie interesującego Cię znaku przy użyciu notacji szesnastkowej lub ósemkowej:
printf "\x41\n" printf "\101\n"
źródło
Do tego rodzaju konwersji używam perla:
perl -e 'printf "%c\n", 65;'
źródło
Jeśli chcesz zapisać wartość ASCII znaku: (zrobiłem to w BASH i zadziałało)
{ char="A" testing=$( printf "%d" "'${char}" ) echo $testing}
wyjście: 65
źródło
Jeśli przekonwertujesz
65
na szesnastkowy, to0x41
:$ echo -e "\x41" A
źródło
$ printf "\x41"
Wielkie litery:
i=67 letters=({A..Z}) echo "${letters[$i-65]}"
Wynik:
źródło
Oto kolejny sposób zamiany 65 na A (przez ósemkę):
help printf # in Bash man bash | less -Ip '^[[:blank:]]*printf' printf "%d\n" '"A' printf "%d\n" "'A" printf '%b\n' "$(printf '\%03o' 65)"
Aby wyszukać w
man bash
celu\'
użycia (choć w tym przypadku daremne):man bash | less -Ip "\\\'" # press <n> to go through the matches
źródło
wypisuje wszystkie "drukowalne" znaki twojej podstawowej konfiguracji basha:
printf '%b\n' $(printf '\\%03o' {30..127}) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
źródło