Printf制表符作为十六进制

时间:2017-10-26 13:27:39

标签: linux bash printf

在受限制的shell中,我只能访问执行printf(没有awk,hexdump,xxd,...),因此我使用此脚本将文件打印为hex:

a=$(<file.txt)
for ((i=0;i<${#a};i++));
do c=${a:$i:1}; 
    if [[ $c == ' ' ]]; then printf "%X" \'\ \'; 
    elif [[ $c == $'\r' ]]; then printf "%X" \'\r\'; 
    elif [[ $c == $'\t' ]]; then printf "%X" \'\t\'; 
    elif [[ $c == $'\n' ]]; then printf "%X" \'\n\'; 
    else printf %02x \'${a:$i:1};
    fi; 
done

问题: 最后一行(printf%02x \'$ {a:$ i:1})不适用于某些字符,如\ s,\ r,\ n,\ t,... 我用(printf“%X”\'\ \')处理空格字符,但不适用于\ r,\ t和\ n

printf "%X" \'\t\' ---> 74
printf "%X" "'\t"  ---> 5C
printf "%X" \'$"\t"---> 5C

但它应该返回09!

1 个答案:

答案 0 :(得分:3)

我从

获得9分
printf "%X" \'$'\t'

引用表达式应该简化代码,不需要:

a=$(<file.txt)
for (( i=0 ; i < ${#a} ; i++ )) ; do
    c=${a:$i:1}
    printf %02x \'"$c"
done