如何在Bash中用sed或tr将制表符转为ASCII单元分隔符输出
制表符转ASCII单元分隔符的正确命令
你之前尝试的命令无效,核心原因是tr和sed都不会直接解析字符串形式的十六进制(如0x09)为控制字符,以下是正确的实现方式:
使用tr命令
tr支持用转义序列表示控制字符,制表符可以用\t,ASCII单元分隔符(0x1f)对应的八进制转义是\037(多数系统的tr默认支持八进制转义),命令如下:
tr '\t' '\037' < 输入文件名 > 输出文件名
如果想直接用十六进制指定目标字符,可以借助printf生成:
tr '\t' "$(printf '\x1f')" < 输入文件名 > 输出文件名
使用sed命令
不同版本的sed语法略有差异:
- GNU sed(Linux系统默认)支持十六进制转义
\x,直接写:
sed 's/\t/\x1f/g' 输入文件名 > 输出文件名
- BSD sed(如macOS系统)需要用八进制转义
\0,命令为:
sed 's/\t/\037/g' 输入文件名 > 输出文件名
为什么之前的命令失效?
- 你写的
tr 0x09 0x1f或tr '0x09' '0x1f',tr会把0x09和0x1f当成普通的字符串字符处理,根本不会匹配到制表符; - sed命令里的
s#0x09#0x1f#g是在替换字符串"0x09"为"0x1f",而非对应的控制字符,自然没有效果。
内容的提问来源于stack exchange,提问作者njamescouk
相关产品推荐
相关产品推荐

