【问题标题】:Perl program to replace tabs with spacesPerl 程序用空格替换制表符
【发布时间】:2011-08-25 05:46:08
【问题描述】:

我想编写一个 Perl 单行代码,将当前目录中的一批文本文件中的所有制表符 '\t' 替换为空格,而不影响可见间距。

谁能教我怎么做?

【问题讨论】:

    标签: perl text file replace


    【解决方案1】:

    perl -p -i -e 's/\t/ /g' file.txt 是一种方法

    【讨论】:

    • 不过,在正则表达式的替换部分中,您可能需要更多的空间
    【解决方案2】:
    $ perl -wp -i.backup -e 's/\t/    /g' *
    

    【讨论】:

      【解决方案3】:

      您不需要 Perl 单行代码,您可以使用 expand 代替:

      expand 实用程序应将文件或标准输入写入标准输出,并将字符替换为填充到下一个制表位所需的一个或多个字符。

      expand 实用程序甚至会为您管理制表位,这似乎是您“不影响可见间距”要求的一部分,Perl 单行可能不会(但我敢打赌这里有人可以提供一条单线)。

      【讨论】:

      • 没关系如果你有一个 expand 实用程序可以做到这一点!我猜你在 Unix 世界里:在 Windows 中 expand.exe 做了一些完全不同的事情。
      【解决方案4】:

      这是FAQ:

      1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
      

      或者您可以只使用Text::Tabs 模块(标准 Perl 发行版的一部分)。

      use Text::Tabs;
      @expanded_lines = expand(@lines_with_tabs);
      

      【讨论】:

        【解决方案5】:

        使用Text::Tabs。以下内容仅略微改编自文档:

        perl -MText::Tabs -n -i.orig -e 'print expand $_' *
        

        【讨论】:

        • 谢谢!我对其进行了调整以将文件规范化为 unix 行结尾并消除尾随空格:perl -MText::Tabs -ni -e 's/\s*$//;s/\s*\r/\n/g;print expand $_,"\n"'
        【解决方案6】:

        您可以使用s/// 来实现此目的。也许你有一行文本存储在 $line 中:

        $line =~ s/\t/    /g;
        

        这应该将每个制表符 (\t) 替换为四个空格。这仅取决于您的文件中一个选项卡有多少个空格。

        这里有一些东西应该可以很快为您完成;随意编辑。

        open(FH, 'tabz.txt');
        
        my @new;
        
        foreach my $line (<FH>) {
            $line =~ s/\t/    /g; # Add your spaces here!
            push(@new, $line);
        }
        
        close(FH);
        
        open(FH, '>new.txt');
        printf(FH $_) foreach (@new);
        close(FH);
        

        【讨论】:

          猜你喜欢
          • 2020-03-11
          • 1970-01-01
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-10
          相关资源
          最近更新 更多