如何使用 sed 将前导制表符替换为 4 个空格?

Syb*_*ser 2 linux sed regular-expression

在 vim 中似乎可以这样做:

:s/^\t\+/\=repeat('    ',len(submatch(0)))
Run Code Online (Sandbox Code Playgroud)

我不知道这如何翻译成 sed 。我尝试了以下操作:

sed -ri "s/^\t\+/\=repeat('    ',len(submatch(0)))/g" test.txt
Run Code Online (Sandbox Code Playgroud)

该命令似乎没有效果。

cas*_*cas 7

这就是expand例如 的用途expand -t 4 file.txt

expand不会编辑原始文件,但您可以重定向到新文件并mv覆盖原始文件,或者sponge如果您已安装它,则使用它,例如

    expand -t 4 file.txt > file.new && mv file.new file.txt
or 
    expand -t 4 file.txt | sponge file.txt
Run Code Online (Sandbox Code Playgroud)

仅供参考,请参阅unexpand执行相反的操作,将多个空格转换为制表符。

expandunexpand支持使用固定宽度的选项卡(例如-t 4-t 8等)选项卡位置列表(例如-t 4,12,32)。他们还可以选择仅转换初始的、前导的空格/制表符。有关详细信息,请参阅手册页。


有关 的更多信息sponge,请参阅man sponge是否有海绵的标准替代方案可以通过管道将文件传输到自身?。简而言之,它使用临时文件为您执行重定向和 mv。顺便说一句,永远不要尝试将标准输出重定向到当前用作标准输入的同一文件。shell 会在读取之前覆盖它。

sponge来自moreutils包。


PS:另请参阅GNU 缩进或许多其他类似的源代码重新格式化工具之一。