发布于2026-07-01 阅读(0)
扫一扫,手机访问
在 Linux/Unix 环境下,文本处理工具多如牛毛,但有些小工具的实用性往往被低估。就说今天要聊的 unexpand,它干的活儿其实很纯粹:把文本里的空格(Space)转成制表符(Tab)。和它唱反调的 expand 命令则正好相反——把制表符打回空格。

也许你会问,这玩意儿到底有啥用?先说几个典型场景:
语法很简单:unexpand [选项] [文件...]。如果不给文件名,它会直接从标准输入读取数据。
默认情况下,unexpand 主要处理行首的空格。加上 -a 参数后,它会“火力全开”,把文本里所有位置的空格都转换成制表符。
# 转换所有空格 unexpand -a input.txt
这个选项用来指定一个制表符相当于几个空格。默认值是 8,但你完全可以按需调整,比如设成 4。有趣的是,它还支持一次设置多个制表位,比如 -t 2,4,8。
# 设置制表符宽度为 4 unexpand -t 4 file.txt # 设置多个制表位(如 2,4,8) unexpand -t 2,4,8 data.txt
这个选项比较克制——只转换每行的第一个空白序列,说白了就是只管行首缩进,其他位置保持原样。
# 只转换行首空格 unexpand --first-only script.py
显示帮助信息,不用多说。
假设你手头有个 Python 文件 example.py,里面全是空格缩进:
def hello():
print("Hello") # 4 个空格
if True:
print("World") # 8 个空格
用 unexpand 处理一下:
unexpand -t 4 example.py > example_tab.py
转换后的效果就很清爽了:
def hello():
print("Hello") # 1 个制表符
if True:
print("World") # 2 个制表符
unexpand 真正强大之处在于它能和管道流水线无缝配合:
# 从命令输出中转换空格 echo " Indented text" | unexpand -t 4 # 与 find 和 xargs 结合使用 find . -name "*.py" -type f | xargs unexpand -t 4
# 原始文件内容
cat << EOF > test.txt
Line 1
Line 2
Line 3 with multiple spaces
EOF
# 只转换行首空格
unexpand --first-only test.txt
这两种东西看着像,本质却不同:
这就好比用尺子量东西——空格是厘米,制表符是“一指宽”,指头粗的人量出来和细的人肯定不一样。
如果文本里空格和制表符混着来,unexpand 有时候会“犯迷糊”,处理结果可能不尽人意。一个稳妥的做法是:先用 expand 把所有东西统一成空格,再让 unexpand 出马。
想看清文件里到底藏了些什么?用 cat -A 最直观——制表符会显示成 ^I,行尾符一览无余。
# 查看文件中的制表符 cat -A example_tab.py
不少项目对代码缩进有严格规定,空格派和制表符派的“圣战”从未停歇。unexpand 能帮你快速把现有代码“站队”到制表符一方。
别小看这个功能。对于那种大量靠空格缩进的大文件,一个制表符顶替几个甚至十几个空格,累积下来节省的空间相当可观。
Windows 和 Unix 关于缩进的“审美”存在差异。unexpand 就像个翻译官,能帮你在不同平台间统一格式。
unexpand 虽然功能单一,但胜在简洁高效。现在的编辑器或 IDE 基本都内置了格式转换功能,可一旦需要在命令行环境下批量处理文件,这个老牌工具依然是最顺手的选择之一。掌握它,不能说你有多牛,但在处理文本格式一致性问题时,绝对能省下不少力气。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8