5

我需要删除看起来像 CR LF 的行的和。

编码 - Windows-1250 Windows 7 EN

我一直在尝试咀嚼,咀嚼,将 \R 更改为没有任何变化 \r\n 等,但没有任何效果......

先感谢您

use strict;
$/ = "\r\n";
open FILE , "<", "file.txt" or die $!;
while (<FILE>) {
    my @line = split /,/ , $_;

    foreach my $l (@line) {
        print $l;
    }
    sleep(1);
}
4

5 回答 5

14

首先,您甚至不尝试将 CRLF 更改为 LF。你只需打印出你得到的东西。

在 Windows 系统上,Perl 将:crlf层添加到文件句柄中。这意味着 CRLF 在读取时更改为 LF,而 LF 在写入时更改为 CRLF。

最后一点是问题所在。默认情况下,Perl 假定您正在创建一个文本文件,但是您正在创建的内容与 Windows 上文本文件的定义不匹配。因此,您需要将输出切换为binmode.

仅适用于 Windows 系统的解决方案:

use strict;
use warnings;

binmode(STDOUT);

open(my $fh, '<', 'file.txt') or die $!;
print while <$fh>;

或者,如果您希望它在任何系统上工作,

use strict;
use warnings;

binmode(STDOUT);

open(my $fh, '<', 'file.txt') or die $!;
while (<$fh>) { 
   s/\r?\n\z//;
   print "$_\n";
}

在输入上没有 binmode,

  • 在非 Windows 系统上,您将获得 CRLF for CRLF。
  • 在 Windows 系统上,您将获得 LF for CRLF。
  • 您将在所有系统上获得 LF for LF。

s/\r?\n\z//处理所有这些。

于 2013-03-31T22:09:00.030 回答
2

如果您在 Unix 之类的命令行上,请在 shell 提示符下执行以下操作:

  • perl -pe 's/^M//g' file.txt # ^M mean control-M, press control-v control-M, the CRLF character
  • perl -pe 's#\r\n$#\n#g' file.txt
  • 于 2013-04-05T03:10:07.460 回答
    1

    这适用于我在 Mac(Mac OS X 10.7.5,Perl 5.16.2)上:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    while (<>)
    {
        print "1: [$_]\n";
        {
            local $/ = "\r\n";
            chomp;
        }
        print "2: [$_]\n";
    }
    

    样本输出:

    $  odx x3.txt
    0x0000: 6F 6E 69 6F 6E 0D 0A 73 74 61 74 65 0D 0A 6D 69   onion..state..mi
    0x0010: 73 68 6D 61 73 68 0D 0A                           shmash..
    0x0018:
    $ perl x3.pl < x3.txt | vis -c
    1: [onion^M
    ]
    2: [onion]
    1: [state^M
    ]
    2: [state]
    1: [mishmash^M
    ]
    2: [mishmash]
    $
    

    odx程序为我提供了数据文件的十六进制转储;您可以看到有 0D 0A (CRLF) 行结尾。该vis -c程序将控制字符(换行符和制表符除外)显示为^M(例如)。您可以看到原始输入包括^M(lines starting 1:) 但chomp'd 行缺少换行符和回车符。

    唯一的问题是 Windows 上的输入是文本文件还是二进制文件。如果是文本文件,I/O 系统应该自动进行 CRLF 映射。如果它是二进制文件,则不会。(Unix 在文本文件和二进制文件之间没有有意义的区别。)在 Windows 上,您可能需要调查binmode,如页面上所述open

    于 2013-03-31T18:26:27.497 回答
    0

    这将是 Perl 中的单行... 在 Linux 下尝试以下操作:

    perl -0pe 's/[\r\n]//g' < file.txt
    sleep 1
    

    以及 Windows 下的以下内容:

    perl.exe -0pe "s/\015\012|\015|\012//g" < file.txt
    ping 1.1.1.1 -n 1 -w 1000 > nul
    
    于 2013-03-31T18:08:20.270 回答
    0

    我认为 \s* 应该工作。

    use strict;
    use warnings;
    
    open FILE , "<", "file.txt" or die $!;
    
    while ( my $line = <FILE> ) {
    
        $line =~ s{ \s* \z}{}xms;  # trim trailing whitespace of any kind
    
        my @columns = split /,/ , $line;
    
        for my $column (@columns) {
    
            print "$column ";
        }
        sleep(1);
    
        print "\n";
    }
    
    于 2013-03-31T19:59:21.313 回答