【问题标题】:In Perl, how to remove ^M from a file?在 Perl 中,如何从文件中删除 ^M?
【发布时间】:2010-10-13 15:19:57
【问题描述】:

我有一个将新字段附加到现有 CSV 的脚本,但是 ^M 字符出现在旧行的末尾,因此新字段最终位于新行而不是同一行。如何使用 Perl 从 CSV 文件中删除 ^M 字符?

【问题讨论】:

标签: perl carriage-return hidden-characters


【解决方案1】:

^M 是回车。你可以这样做:

$str =~ s/\r//g

【讨论】:

    【解决方案2】:

    将 DOS 样式转换为 UNIX 样式的行尾:

    for ($line in <FILEHANDLE>) {
       $line =~ s/\r\n$/\n/;
    }
    

    或者,删除 UNIX 和/或 DOS 样式的行尾:

    for ($line in <FILEHANDLE>) {
       $line =~ s/\r?\n$//;
    }
    

    【讨论】:

    • 不会也删除换行符吗?
    • 我想这取决于你的目标。我进行了编辑以显示这两种策略。
    【解决方案3】:

    或 1-liner:

    perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
    

    【讨论】:

    • 很容易记住这个是 Perl Pie。
    • 在 Windows 上使用此命令传递 *.txt 不起作用。它给出:无法打开 *.txt:参数无效。有人吗?
    • 不需要全局 'g' 因为 '$' 只匹配行尾。
    【解决方案4】:

    你发现你也可以这样做:

    $line=~ tr/\015//d;
    

    【讨论】:

    • 不像\r 那样可读性 - 任何看到它的人(或一年后的你自己)都会很高兴看到评论说明它的作用
    【解决方案5】:

    在 vi 中点击:

    然后s/Control-VControl-M//g

    Control-V Control-M 显然是那些键。不要拼出来。

    【讨论】:

    • 在这样的源代码中逐字包含非打印字符(如回车)是一个坏主意。使用 \r 转义要好得多,它 (a) 易于查看并且 (b) 如果重新格式化源代码也不会丢失。
    【解决方案6】:

    有点不相关,但要使用 Perl 从命令行中删除 ^M,请执行以下操作:

    perl -p -i -e "s/\r\n/\n/g" file.name
    

    【讨论】:

      【解决方案7】:

      这一行替换所有 ^M 字符:

      dos2unix <file-name>
      

      您可以从 Perl 内部或直接在 Unix 提示符下调用它。

      【讨论】:

        【解决方案8】:

        我更喜欢使用 DOS 或 Unix 输入的更通用的解决方案。假设输入来自 STDIN:

        while (defined(my $ln = <>))
          {
            chomp($ln);
            chop($ln) if ($ln =~ m/\r$/);
        
            # filter and write
          }
        

        【讨论】:

          【解决方案9】:

          这就是解决我的问题的方法。 ^M 是回车,在 Perl 脚本中很容易避免。

          while(<INPUTFILE>)
          {
               chomp;
               chop($_) if ($_ =~ m/\r$/);
          }
          

          【讨论】:

          • 这会从 CSV 文件中删除 ^M 吗?更改输入文件?它会创建一些没有它们的输出文件吗?
          【解决方案10】:

          我有一个小脚本。对其进行修改有助于过滤掉跨平台遗留文件中的一些其他不可打印字符。

          #!/usr/bin/perl
          # run this as
          # convert_dos2unix.pl < input_file > output_file
          undef $/;
          $_ = <>;
          s/\r//ge;
          print;
          

          【讨论】:

            【解决方案11】:

            perl 命令将 dos 行结尾转换为以原始文件备份结尾的 unix 行:

            perl -pi.bak -e 's/\r\n/\n/g' filename
            

            此命令生成带有 unix 行结尾的文件名,并将原始文件保留为 filename.bak。

            【讨论】:

              猜你喜欢
              • 2016-07-29
              • 1970-01-01
              • 2021-12-23
              • 2022-08-18
              • 1970-01-01
              • 2020-09-02
              • 2013-02-19
              相关资源
              最近更新 更多