【问题标题】:Converting a file's indentation from tabs to spaces将文件的缩进从制表符转换为空格
【发布时间】:2014-01-30 08:23:09
【问题描述】:

将制表符缩进文件转换为空格缩进文件的最佳方法是什么?

我希望能够为每个选项卡替换指定可变数量的空格。

换句话说,在以连续制表符序列开头的每一行中,我想用 X 个空格替换序列中的每个制表符,我可以在其中设置 X。

我不介意使用什么工具,无论是 AWK、sed 还是 Vim。

有人知道最好的方法是什么吗?

更新/解释/澄清:

换句话说,这是我运行文件所需的过程:

“在每一行中,将该行第一个非制表符之前的每个制表符替换为 3 个空格”

【问题讨论】:

  • 试试:expand -it 3 < original-file > new-file
  • 发布一些示例输入和预期输出。

标签: vim sed awk indentation


【解决方案1】:

在 Linux 或许多 Unix 系统上最简单的解决方案是使用 expand 命令。

如果您使用 Vi 或 Vim 编辑文件,您可以将以下内容添加到您的 .vimrc 文件中,以确保在编辑文件时标签始终扩展为空格:

set expandtab

有关 Vim 和选项卡的更多信息,请参阅Converting Tabs To Spaces

【讨论】:

    【解决方案2】:

    在 Vim 中,您首先需要将 'tabstop' 设置为 Tab 应表示的所需空格数,并指示 Vim 扩展为空格:

    :setlocal tabstop=3 expandtab
    

    然后,您可以通过

    所有(不仅仅是缩进)制表符更改为空格
    :%retab
    

    【讨论】:

    • 你不需要指定%:默认是整个文件。此外,您可以在:retab 行中设置'tabstop' 的新值::setl expandtab,然后是:retab 3
    【解决方案3】:

    如果你想用 N 个空白字符序列替换所有选项卡:

    pr -e3 -t file
    

    上面说“用3个空格字符替换每个选项卡并且不添加标题”,例如:

    $ printf 'a\tb\tc\n'
    a       b       c
    
    $ printf 'a\tb\tc\n' | pr -e3 -t
    a  b  c
    
    $ printf 'a\tb\tc\n' | pr -e12 -t
    a           b           c
    

    如果你只想替换前导制表符,那么你可以使用(“文件”中的所有空格都是制表符):

    $ cat file
    a       b
            c       d
                    e       f
    
    $ awk -v nc=3 'match($0,/^\t+/){ $0=sprintf("%*s%s",nc*RLENGTH,"",substr($0,RSTART+RLENGTH)) }1' file
    a       b
       c    d
          e f
    
    $ awk -v nc=12 'match($0,/^\t+/){ $0=sprintf("%*s%s",nc*RLENGTH,"",substr($0,RSTART+RLENGTH)) }1' file
    a       b
                c   d
                            e       f
    

    所以你可以看到标签为#s:

    $ cat file | tr '\t' '#'
    a#b
    #c#d
    ##e#f
    $
    $ awk -v nc=3 'match($0,/^\t+/){ $0=sprintf("%*s%s",nc*RLENGTH,"",substr($0,RSTART+RLENGTH)) }1' file | tr '\t' '#'
    a#b
       c#d
          e#f
    

    另外,如果您的 UNIX 有 indent 命令,请查看它。

    【讨论】:

      【解决方案4】:

      也许是 VI(M) 搜索和替换?用空格替换制表符会破坏列对齐...

      :%s/\t/        /g
      

      【讨论】:

        【解决方案5】:

        这是一个awk。如果与nt 值设置为相同的选项卡,它将用空格替换选项卡:

        awk  '{for (i=1;i<=NF;i++) if ($i=="\t") t++;if (t==nt) for (i=1;i<=t;i++) $i=" ";t=0}1' nt=2 FS="" OFS="" file
        

        有了这个文件:

        cat file
        no tab
                test 1 tab
                        more 2 tab
                                even more 3 tab
        

        nt=2,你会得到:

        no tab
                test 1 tab
          more 2 tab
                                even more 3 tab
        

        在第二行替换了两个标签

        这可能更复杂一些,只在行首查找制表符。

        更具可读性:

        awk  '
            {
            for (i=1;i<=NF;i++) 
                if ($i=="\t")
                    t++
            if (t==nt) 
                for (i=1;i<=t;i++) 
                    $i=" "
            t=0
            }
            1
            ' nt=2 FS="" OFS="" file
        

        【讨论】:

          【解决方案6】:
          awk '{s="";i=1;while(substr($0,i++,1)=="\t")s=s "   ";sub(/^\t*/,s)}1'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-12
            • 1970-01-01
            • 2020-11-22
            相关资源
            最近更新 更多