LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1067|回复: 8

怎么把a到z的字母替换成01到26的数字

[复制链接]
发表于 2005-8-23 20:28:50 | 显示全部楼层 |阅读模式
前面几个可以用tr [a-i] [1-9]
后面的不行
发表于 2005-8-24 00:06:43 | 显示全部楼层
这需要用到hash吧 :ask
回复 支持 反对

使用道具 举报

发表于 2005-8-24 01:22:19 | 显示全部楼层
  1. $ CHAR=d
  2. $ expr $(echo ${CHAR} | od -i | awk '{ print $2 }') - $(echo a | od -i | awk '{ print $2 }') + 1
  3. 4
复制代码


ps:还不如用 C 写个程序呢
回复 支持 反对

使用道具 举报

发表于 2005-8-24 21:34:32 | 显示全部楼层
要是我就用笨方法,写26个替换放到一起哈
大家别笑话我,简单,好写,还有别的什么高明方法请赐教
回复 支持 反对

使用道具 举报

发表于 2005-8-28 12:35:14 | 显示全部楼层
受3楼启发

  1. echo $(($(showkey -a <<!2>/dev/null|awk '$1>=97&&$1~/[0-9]/{print $1}'
  2. $1
  3. !)-96))
复制代码

test:

  1. /home/lee#sh str z
  2. 26
  3. /home/lee#sh str a
  4. 1
  5. /home/lee#sh str c
  6. 3
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-8-28 13:29:18 | 显示全部楼层
其实就是 C 的
  1. int n = 'x' - 'a' + 1;
复制代码
的 Shell 版本,怎样表达并不重要。另外,这个只有当编码的 a-z 或 A-Z 是连续的时候才有效,但当前的编码都是这样的。
回复 支持 反对

使用道具 举报

发表于 2005-8-28 13:54:10 | 显示全部楼层
echo $((`echo -n a | od | head -n 1 | cut -d' ' -f 2`-96))

这个要好记些



hua@hua:~$ echo $((`echo -n a | od | head -n 1 | cut -d' ' -f 2`-96))
1
hua@hua:~$ echo $((`echo -n b | od | head -n 1 | cut -d' ' -f 2`-96))
2
hua@hua:~$ echo $((`echo -n z | od | head -n 1 | cut -d' ' -f 2`-96))
26
hua@hua:~$







要不就写成函数 xia() 吧

hua@hua:~$ xia() { echo $((`echo -n $1 | od | head -n 1 | cut -d' ' -f 2`-96)) ; }
hua@hua:~$ xia a
1
hua@hua:~$ xia b
2
hua@hua:~$ xia c
3
hua@hua:~$ xia x
24
hua@hua:~$ xia y
25
hua@hua:~$ xia z
26
hua@hua:~$





满意了吧 :)
回复 支持 反对

使用道具 举报

发表于 2005-8-28 14:10:19 | 显示全部楼层
Post by 寂寞烈火
受3楼启发

  1. echo $(($(showkey -a <<!2>/dev/null|awk '$1>=97&&$1~/[0-9]/{print $1}'
  2. $1
  3. !)-96))
复制代码

test:

  1. /home/lee#sh str z
  2. 26
  3. /home/lee#sh str a
  4. 1
  5. /home/lee#sh str c
  6. 3
复制代码

Post by jhuangjiahua
echo $((`echo -n a | od | head -n 1 | cut -d' ' -f 2`-96))

这个要好记些



hua@hua:~$ echo $((`echo -n a | od | head -n 1 | cut -d' ' -f 2`-96))
1
hua@hua:~$ echo $((`echo -n b | od | head -n 1 | cut -d' ' -f 2`-96))
2
hua@hua:~$ echo $((`echo -n z | od | head -n 1 | cut -d' ' -f 2`-96))
26
hua@hua:~$







要不就写成函数 xia() 吧

hua@hua:~$ xia() { echo $((`echo -n $1 | od | head -n 1 | cut -d' ' -f 2`-96)) ; }
hua@hua:~$ xia a
1
hua@hua:~$ xia b
2
hua@hua:~$ xia c
3
hua@hua:~$ xia x
24
hua@hua:~$ xia y
25
hua@hua:~$ xia z
26
hua@hua:~$





满意了吧 :)


为了可移植性,
不要用硬编码,如 96 这样的东西。尽可能使它不依赖于具体的编码。
同时,也不要假设目标 Shell 是 bash。尽可能使它可以在所有的 Shell 中可用。
回复 支持 反对

使用道具 举报

发表于 2005-8-28 14:51:59 | 显示全部楼层
在 dash ,sh 里运行通过

dash 是符合 POSIX 的 :)


如果要去掉这个 96

就用  echo $((`echo -n a | od | head -n 1 | cut -d' ' -f 2`-`echo -n a | od | head -n 1 | cut -d' ' -f 2`+1))
这个吧


xia() { echo $((`echo -n $1  | od | head -n 1 | cut -d' ' -f 2`-`echo -n a | od | head -n 1 | cut -d' ' -f 2`+1)) }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表