obtener un valor ASCII numérico para un personaje


10

Estoy tratando de escribir un script de shell que pide un carácter ASCII en el rango AZ o az y devuelve su valor numérico equivalente. Por ejemplo, el resultado podría tener el siguiente aspecto:

scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A       
scarlet$ The decimal value of A is: 65 

Mi intento:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "

Edité su segunda pregunta ya que no estaba relacionada; debe publicarlo por separado (puede obtener el texto original aquí )
— Michael Mrozek

Tu ejemplo me funciona. ¿Puedes pegar la salida que muestra lo que sucede y describir cuál es el error? ¿Hace echo -n Alo que esperas? Si no, intente en su printflugar. ¿Hace od -ilo que esperas? Si no, inténtalo od -t d1.
— Mikel

1
Probé d1 -t desde trabajó grandes ... Gracias
— Anfitrión Mensaje

Respuestas:


8

POSIX: printf a | od -A n -t d1

Perl: perl -e 'print ord($ARGV[0])' a

Perl, haciendo frente a UTF-8 si está en un entorno local UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ


8

POSIX:

$ printf %d\\n \'a
97

También funciona con caracteres no ASCII en bash 4.0 y posterior y en zsh:

$ printf %x\\n \'あ
3042

También puede usar recode ..dumppara ver puntos de código hexadecimales:

$ printf aあ|recode ..dump
UCS2   Mne   Description

0061   a     latin small letter a
3042   a5    hiragana letter a

2
Para hacerlo un poco menos "oscuro", también se puede usar, por ejemplo, A=a ; printf '%d\n' "'$A'"y en ksh algo como A=a; integer N=$(("'$A'")); print $N(no se necesita print o printf).
— jelmd

3

Tal vez:

#!/bin/bash

echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo

Salud


Simplemente usaría awk, en lugar de nawk. Esto es bastante estándar para cualquier versión awk.
— asoundmove

Editado, es mi costumbre de usar 'nawk' ya que no he trabajado en el trabajo
— D4RIO

Sí, su solución funcionó para mí también .. gracias
— Anfitrión mensaje

1

Una solución sin od, solo bash, y solo minúsculas, hasta ahora. zes el personaje buscado, aquí scomo búsqueda. i=97porque ascii (a) = 97. El resto es obvio.

z=s 
i=97
for c in {a..z}
do 
    [ "$c" = "$z" ] && echo $i && break || ((i+=1))
done

Puede ponerlo en una sola línea, por supuesto. Aquí hay algunos punto y coma: ;;;;;(debería ser suficiente)


Probé el código anterior ... pero no funcionó para mí ... ¡Recibí un mensaje que decía que "i + = 1" no se encuentra!
— Anfitrión Post

Esto funciona en bash. Es posible que necesite i = $ ((i + 1)) en su lugar.
— Usuario desconocido

En una línea y con la lectura de una tecla del teclado:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
— erik

0

Pruébalo od -t d1si lo tienes. Los otros formatos de salida son bastante raros.

Tampoco necesita cabeza y corte, por ejemplo:

printf "A" | od -t d1 | read addr num && echo $num

0

Si solo desea un programa que haga esto y no lo está haciendo como ejercicio, entonces hay un programa llamado asciique hace esto. Su distribución ya puede ofrecerla como un paquete, si no la obtiene de http://www.catb.org/~esr/ascii/ .


0
# Get one character per loop, until the user presses <Enter>
while true ; do 
    read -n 1 c
    (( ${#c} == 0 )) && break # Exit the loop. Input length is 0  
                              # ie. The user has pressed Enter
    #
    if [   \( ! "$c" \< "a" -a  ! "$c" \> "z" \) \
        -o \( ! "$c" \< "A" -a  ! "$c" \> "Z" \) ]
    then
        val=($(ascii -s $c)) # build an array of ascii info for this char 
        echo " ... The decimal value of $c is: ${val[1]}"
    else
        echo -n  $'\r \r' # overwrite the invalid character
    fi 
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.