社区首页 >问答首页 >如何在bash中“卸载”字符串?

如何在bash中“卸载”字符串?
EN

Stack Overflow用户
提问于 2019-11-14 15:57:17
回答 3查看 339关注 0票数 2

我需要使用bash命令将字符串转换为十进制ascii代码序列。

示例:对于字符串“abc”,需要的输出是979899

其中a=97、b=98和c=99在ascii十进制代码中。

我能够通过使用xxd的ascii十六进制代码来实现这一点。

代码语言:javascript
代码运行次数:0
复制
printf '%s' 'abc' | xxd -p

这给了我一个结果:616263

其中a=61、b=62和c=63在ascii十六进制代码中。

是否存在与xxd等价的结果,以ascii十进制代码代替ascii十六进制代码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-14 18:02:41

如果您不介意将结果合并到一行中,请尝试以下操作:

代码语言:javascript
代码运行次数:0
复制
echo -n "abc" | xxd -p -c 1 |
while read -r line; do
    echo -n "$(( 16#$line ))"
done

结果:

代码语言:javascript
代码运行次数:0
复制
979899
票数 1
EN

Stack Overflow用户

发布于 2019-11-14 17:32:48

Unicode解决方案

使这个问题恼人的是,当您将十六进制转换为十进制时,必须对字符进行管道处理。因此,您不能简单地从char转换为十六进制到dec,因为一些字符十六进制表示比其他字符更长。

这两种解决方案都与unicode兼容,并使用字符的代码点。在这两种解决方案中,为了清晰起见,选择换行符作为分隔符;如果没有分隔符,则将其更改为''

Bash

代码语言:javascript
代码运行次数:0
复制
sep='\n'
charAry=($(printf 'abc' | grep -o .))
for i in "${charAry[@]}"; do
  printf "%d$sep" "'$i"
done && echo
97
98
99
127926

Python (以Bash表示)

在这里,我们使用一个列表理解来将每个字符转换为一个十进制数(ord),以字符串的形式加入它并打印它。sys.stdin.read()允许我们使用Python从管道中获取输入。如果用预期的字符串替换input,则此解决方案将跨平台。

代码语言:javascript
代码运行次数:0
复制
printf '%s' 'abc' | python -c "
import sys
input = sys.stdin.read()
sep = '\n'
print(sep.join([str(ord(i)) for i in input]))"
97
98
99
127926

编辑:如果您只关心使用十六进制而不管编码,请使用@user1934428的答案。

票数 1
EN

Stack Overflow用户

发布于 2019-11-14 22:21:55

代码语言:javascript
代码运行次数:0
复制
str=abc
printf '%s' $str | od -An -tu1

-An去掉通常输出的地址行,-tu1将每个输入字节视为无符号整数。请注意,它假定一个字符是一个字节,因此它不能使用Unicode、JIS等。

如果您真的不需要结果中的空格,那么将其进一步导入到tr -d ' '中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58868334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档