我需要删除看起来像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);
}
答案 0 :(得分:10)
首先,您甚至不尝试将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,
s/\r\n\z//
处理所有这些。
答案 1 :(得分:3)
如果你在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
答案 2 :(得分: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
(以1:
开头的行),但chomp
'd行缺少换行符和回车符。
唯一的问题是Windows上的输入是文本文件还是二进制文件。如果是文本文件,I / O系统应自动执行CRLF映射。如果是二进制文件,则不会。 (Unix在文本和二进制文件之间没有明显的区别。)在Windows上,您可能需要调查binmode
,如open
页面所述。
答案 3 :(得分:0)
我认为\ *应该有用。
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";
}
答案 4 :(得分:-1)
这将是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