bash/awk 中的 ascii 值

bash/awk 中的 ascii 值

我有一个疑问,我知道用这个命令,它会根据 Ascii 表打印一个字符的值:

printf "%d\n" "'a" ##prints 97

但我想知道如何让我的程序显示一个单词的 ascii 值,有人能告诉我这是否可能吗,或者我如何将每个字母的值相加以得到由字母总和形成的单词的值的结果?

答案1

如果您能理解 Python,一个简单的脚本将显示字符的 ASCII 值:

创建一个脚本(例如 ascii.py)

#!/usr/bin/python
import fileinput
for line in fileinput.input():
    for c in line:
        print ord(c)

然后这样调用脚本:

echo "hello" | ascii.py

这可以轻松修改为总 ASCII 值。

答案2

这归结为迭代单词字母的问题,这在 bash 中并不简单。我的方法非常粗暴,但似乎有效:

#!/bin/bash
WORD="$1"
REGEXP='';
ASCIISUM=0
while true; do
        LETTER=$(echo "$WORD" | sed "s/$REGEXP\(.\).*/\1/")
        test "$LETTER" == "$WORD" && break;
        ASCII=$(printf '%d' "'$LETTER")
        echo "Adding '$LETTER': $ASCII"
        ASCIISUM=$(($ASCIISUM+$ASCII))
        REGEXP=".$REGEXP"
done
echo "Sum of ASCII values of '$WORD': $ASCIISUM"

保存到例如asciisum.sh并调用/path/to/asciisum.sh "word"

编辑:

一些解释:

  • REGEXP 用于维护句点的正则表达式,每个经过的字母恰好一个 - 这与我想要的字母之前的字母匹配。
  • 我现在使用sed过滤掉这些已经完成的字母和当前字母之后的每个字母,只留下当前字母
  • 如果我的正则表达式不再匹配(即WORD没有改变sed),循环就会被打破
  • 从这里开始就很简单了:计算字母的 ASCII 码并加到总和中

相关内容