打印“\ x09”,打印0x20,如何打印0x09到STDOUT?

时间:2016-01-27 14:06:07

标签: python bash perl

我尝试打印到STDOUT的0x09(水平TAB)值,但在perl,python或bash 0x09中替换为0x20(空格)。

$ hexdump -C <<< $(perl -e 'print "A\x09B" ')
00000000  41 20 42 0a                                       |A B.|
00000004

bash中的同样问题:

$ hexdump -C <<< $(printf "A\x09B")
00000000  41 20 42 0a                                       |A B.|
00000004

可以将0x09值打印到STDOUT吗?

2 个答案:

答案 0 :(得分:8)

问题在于Bash 扩展;将命令放入反引号中会遇到同样的问题:

$ echo `python -c 'print "A\x09B"'`
A B

避免扩张;它将您的输入拆分为空格并重新加入下一个命令;你看到多个空格相同:

$ hexdump -C <<< $(python -c 'print "A\x20\x20\x20B"')
00000000  41 20 42 0a                                       |A B.|
00000004

改为使用管道:

$ python -c 'print "A\x09B"' | hexdump
0000000 41 09 42 0a
0000004

或引用命令(奇迹般地,额外的引号不会与命令行本身使用的引号冲突!):

hexdump -C <<< "$(python -c 'print "A\x20\x20\x20B"')"

正在扩展的子进程输出是bash中的一个错误,需要在bash 4.4中修复。

答案 1 :(得分:2)

这完全是一个bash问题。具体来说,它是一个bash bug,可以解决如下:

                 +-------- Add these ---------+
                 |                            |
                 v                            v
$ hexdump -C <<< "$(perl -e 'print "A\x09B"' )"
00000000  41 09 42 0a                                       |A.B.|
00000004

可替换地,

# Passed via STDIN as the original.
$ perl -e 'print "A\x09B"' | hexdump -C
00000000  41 09 42                                          |A.B|
00000003

# Passed via a file name.
$ hexdump -C <( perl -e 'print "A\x09B"' )
00000000  41 09 42                                          |A.B|
00000003