Ganzzahliger ASCII-Wert zum Zeichen in BASH mit printf

84

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.)

quelle
Verwenden Sie unter Windows ALT + 65, um das ASCII-Zeichen zu drucken - das funktioniert leider nicht mit Unix / bash;)
Schnaader
2
@schnaader aber das kann man nicht schreiben.
Strg-Alt-Delor
2
@richard: Errr .. es ist weder einfach noch praktisch, aber Sie könnten :) "Starten" Sie einfach eine VM unter Windows oder MS-DOS und senden Sie "echo", ALT, 6, 5, "> mysharedfolder \ file.txt" als Drücken Sie die Tasten und lesen Sie file.txt aus dem freigegebenen VM-Ordner.
Schnaader
2
@schnaader könntest du dafür wein verwenden?
Emory

Antworten:

68

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}'
erweitern
quelle
3
Sollte auch funktionierenprintf "$(printf '\\x%02x' $char)"
0andriy
31

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
13

Bei Ihrer zweiten Frage scheint die Syntax ( \'A) für führende Anführungszeichen spezifisch zu sein für printf:

Wenn das führende Zeichen ein einfaches oder doppeltes Anführungszeichen ist, ist der Wert der numerische Wert im zugrunde liegenden Codesatz des Zeichens nach dem einfachen oder doppelten Anführungszeichen.

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

David Hu
quelle
9

Eine Möglichkeit besteht darin, das gewünschte Zeichen direkt in Hexadezimal- oder Oktalschreibweise einzugeben:

printf "\x41\n"
printf "\101\n"
Naaff
quelle
8

Für diese Art der Konvertierung verwende ich Perl:

perl -e 'printf "%c\n", 65;'
Mouviciel
quelle
2
oder drucke in Perl chr (65), "\ n"; Während Perl eine gute Wahl sein kann, wenn Sie viel davon tun, funktioniert die Verwendung von printf der Shell, um Ihre Nummer in etwas umzuwandeln, das in eine \ 0-Escape-Sequenz gehen kann, einwandfrei. Komplexer mit Unicode, da Sie Unterstützung in Ihrem printf benötigen.
Peter Cordes
Leider ist Perl eine vergessene Sprache. Besser ist Python, das mittlerweile auf fast jedem Linux-Computer verfügbar ist. Außerdem geht es um Shell-Bash und nicht um andere Plattformen!
s3n0
7

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

MagicMercury86
quelle
Das hat funktioniert, danke. Ich wollte eine Ganzzahl (ASCII-Code) von einem eingegebenen Zeichen erhalten. Ich habe ein Skript erstellt: {read -n 1 c; echo $ (printf "% d" "'$ {c}")}
Phaedrus
4

Wenn Sie 65in hexadezimal konvertieren , ist es 0x41:

$ echo -e "\x41" A

Cyber ​​Oliveira
quelle
Wenn Sie den Hex-Wert zum Drucken von ASCII-Zeichen kennen$ printf "\x41"
katta
3

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 bashnach \'Verwendung (obwohl in diesem Fall zwecklos):

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

Für Großbuchstaben:

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

Ausgabe:

C.
Cyrus
quelle
1

Dadurch werden alle "druckbaren" Zeichen Ihres grundlegenden Bash-Setups gedruckt:

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

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
AG6HQ
quelle