在受限的 shell 中,我只能执行 printf(没有 awk、hexdump、xxd 等),所以我使用这个脚本将文件打印为十六进制:
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!
最佳答案
我从中得到 9
printf "%X" \'$'\t'
引用表达式应该简化代码,不需要 ifs:
a=$(<file.txt)
for (( i=0 ; i < ${#a} ; i++ )) ; do
c=${a:$i:1}
printf %02x \'"$c"
done
关于linux - 将制表符打印为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46955651/