linux - 将制表符打印为十六进制

标签 linux bash printf

在受限的 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/

相关文章:

java - 在linux中设置JDK路径

bash - 从一系列 PDF 中删除第一页

macos - 如何在 Mac OS X 上从终端启用用户帐户 SMB 共享?

linux - 压缩 Bash 脚本以解析文件

matlab - 在 matlab 函数中控制冗长的想法/最佳实践

visual-studio - Visual Studio swprintf 让我所有的 %s 格式化程序都想要 wchar_t * 而不是 char *

java -/usr/bin/ld : cannot find -ljvm:during compiling jni project

linux - 在mac中递归选择文件 - 需要美化目录中的所有文件

java - 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

string - 有没有办法做反Sprintf结果