如何用空格替换intraline标签,保持对齐?

Dre*_*ens 5 regex vim sed

我喜欢使用空格来缩进而不是标签; 在行的开头替换制表符很容易sedvim:

s/^I/    /g
Run Code Online (Sandbox Code Playgroud)

但是如果一行中有选项卡(假设空格是选项卡字符的宽度):

'foo'^I ^I  => 'bar',
'bazzle'^I  => 'qux',
Run Code Online (Sandbox Code Playgroud)

每个选项卡都不对应于维持对齐的设定数量的空格.任何人都有一个狡猾的想法,如何在保持正确对齐的同时用空格替换这些制表符?

Hai*_* Vu 12

在Linux和BSD下,查找expand和unexpand命令行工具.expand会将制表符转换为空格,而unexpand会执行相反的操作.最简单的用法是:

expand filename
Run Code Online (Sandbox Code Playgroud)

如果你像我一样,使用4个空格作为标签,那么:

expand -t 4 filename
Run Code Online (Sandbox Code Playgroud)

默认情况下,将打印件展开到标准输出并保留原始文件.要进行就地替换,您至少有两种选择:

$ cp filename backup
$ expand -t 4 filename > tempfile
$ mv tempfile filename
Run Code Online (Sandbox Code Playgroud)

或者,您可以在vi中调用expand:

$ vi filename
:%!expand -t 4
Run Code Online (Sandbox Code Playgroud)


cmc*_*nty 8

在Vim:

:retab
Run Code Online (Sandbox Code Playgroud)

或者,如果您在空格后面有标签:

:retab!
Run Code Online (Sandbox Code Playgroud)