在Perl中,如何从文件中删除^ M?

我有一个脚本将新字段附加到现有CSV,但是旧字符末尾出现
^M
字符,因此新字段最终会出现在新行而不是同一行。如何使用Perl从CSV文件中删除
^M
字符?     
已邀请:
^ M是回车。你可以这样做:
$str =~ s/\r//g
    
或1个班轮:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
    
你发现你也可以这样做:
$line=~ tr/\015//d;
    
稍微不相关,但要使用Perl从命令行中删除^ M,请执行以下操作:
perl -p -i -e "s/\r\n/\n/g" file.name
    
我更喜欢一种更通用的解决方案,可以使用DOS或Unix输入。假设输入来自STDIN:
while (defined(my $ln = <>))
  {
    chomp($ln);
    chop($ln) if ($ln =~ m/\r$/);

    # filter and write
  }
    
这个衬里替换了所有^ M个字符:
dos2unix <file-name>
您可以从Perl内部或直接在Unix提示符下调用它。     
要将DOS样式转换为UNIX样式行结尾:
for ($line in <FILEHANDLE>) {
   $line =~ s/\r\n$/\n/;
}
或者,要删除UNIX和/或DOS样式行结尾:
for ($line in <FILEHANDLE>) {
   $line =~ s/\r?\n$//;
}
    
这就解决了我的问题。 ^ M是回车符,可以在Perl脚本中轻松避免。
while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
    
我有一点脚本。对它的修改有助于过滤掉跨平台遗留文件中的其他一些不可打印的字符。
#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
    
在vihit
:
。 然后
s/Control-VControl-M//g
Control-V
Control-M
显然是那些钥匙。不要说出来。     

要回复问题请先登录注册