使用tr命令替换文件制表符为点号无效果该如何解决?
问题根因
你使用的tr命令语法完全正确,执行后无替换效果的核心原因是:tabs.txt中行首的空白字符不是你认为的制表符(\t),而是普通的空格字符,因此tr匹配不到需要替换的目标字符,输出和原文件一致。
验证方法
执行以下命令查看文件中的不可见字符,确认空白类型:
cat -A tabs.txt
- 如果行首空白显示为
^I,代表是制表符 - 如果行首空白显示为普通空格,代表是空格字符
解决方案
场景1:确认文件中存在制表符,仅需替换制表符为点
推荐直接省略冗余的cat管道,直接通过输入重定向执行tr,两种写法都可用:
- 字符字面量写法:
tr '\t' '.' < tabs.txt - ASCII八进制写法(和你原命令逻辑一致):
tr '\t' '\056' < tabs.txt
如果需要直接修改原文件,执行以下命令:tr '\t' '.' < tabs.txt > tmp.txt && mv tmp.txt tabs.txt
场景2:文件中空白为空格,需要替换空白为点
- 如果需要把所有行内、行首的空白(不管是空格还是制表符)都替换为点,执行:
tr '[:blank:]' '.' < tabs.txt - 如果仅需要把行首的连续空白替换为单个点,使用sed实现:
sed 's/^[[:blank:]]\+/\./' tabs.txt
内容的提问来源于stack exchange,提问作者lipo
相关产品推荐
相关产品推荐

