Zeichen zu Wert funktioniert:
$ printf "%d\n" \'A
65
$
Ich habe zwei Fragen, die erste ist am wichtigsten:
- Wie nehme ich 65 und verwandle es in A?
- \ 'A konvertiert ein ASCII-Zeichen mit printf in seinen Wert. Ist die Syntax für printf spezifisch oder wird sie irgendwo anders in BASH verwendet? (Solche kleinen Zeichenfolgen sind für Google schwer zu finden.)
Antworten:
Eine Linie
printf "\x$(printf %x 65)"
Zwei Linien
set $(printf %x 65) printf "\x$1"
Hier ist eine, wenn Sie nichts dagegen haben
awk
awk 'BEGIN{printf "%c", 65}'
quelle
printf "$(printf '\\x%02x' $char)"
Dies funktioniert (mit dem Wert in Oktal):
$ printf '%b' '\101' A
sogar für (einige: gehen Sie nicht über 7) Sequenzen:
$ printf '%b' '\'{101..107} ABCDEFG
Ein allgemeines Konstrukt, das (Dezimal-) Werte in einem beliebigen Bereich zulässt, ist:
$ printf '%b' $(printf '\\%03o' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Oder Sie können die Hex-Werte der Zeichen verwenden:
$ printf '%b' $(printf '\\x%x' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Sie können das Zeichen auch mit xxd zurückerhalten (verwenden Sie hexadezimale Werte):
$ echo "41" | xxd -p -r A
Das heißt, eine Aktion ist die Umkehrung der anderen:
$ printf "%x" "'A" | xxd -p -r A
Und funktioniert auch mit mehreren Hex-Werten gleichzeitig:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r ABCDEFGHIJ
oder Sequenzen (printf wird hier verwendet, um Hex-Werte zu erhalten):
$ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ
Oder benutze sogar awk:
$ echo 65 | awk '{printf("%c",$1)}' A
auch für Sequenzen:
$ seq 65 90 | awk '{printf("%c",$1)}' ABCDEFGHIJKLMNOPQRSTUVWXYZ
quelle
Bei Ihrer zweiten Frage scheint die Syntax (
\'A
) für führende Anführungszeichen spezifisch zu sein fürprintf
:Von http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
quelle
Eine Möglichkeit besteht darin, das gewünschte Zeichen direkt in Hexadezimal- oder Oktalschreibweise einzugeben:
printf "\x41\n" printf "\101\n"
quelle
Für diese Art der Konvertierung verwende ich Perl:
perl -e 'printf "%c\n", 65;'
quelle
Wenn Sie den ASCII-Wert des Zeichens speichern möchten: (Ich habe dies in BASH gemacht und es hat funktioniert)
{ char="A" testing=$( printf "%d" "'${char}" ) echo $testing}
Ausgabe: 65
quelle
Wenn Sie
65
in hexadezimal konvertieren , ist es0x41
:$ echo -e "\x41" A
quelle
$ printf "\x41"
Hier ist noch eine andere Möglichkeit, 65 in A umzuwandeln (über Oktal):
help printf # in Bash man bash | less -Ip '^[[:blank:]]*printf' printf "%d\n" '"A' printf "%d\n" "'A" printf '%b\n' "$(printf '\%03o' 65)"
So suchen Sie
man bash
nach\'
Verwendung (obwohl in diesem Fall zwecklos):man bash | less -Ip "\\\'" # press <n> to go through the matches
quelle
Für Großbuchstaben:
i=67 letters=({A..Z}) echo "${letters[$i-65]}"
Ausgabe:
quelle
Dadurch werden alle "druckbaren" Zeichen Ihres grundlegenden Bash-Setups gedruckt:
printf '%b\n' $(printf '\\%03o' {30..127}) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
quelle