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

时间:2009-03-16 14:48:17

标签: perl carriage-return hidden-characters

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

10 个答案:

答案 0 :(得分:46)

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

$str =~ s/\r//g

答案 1 :(得分:23)

或1-liner:

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

答案 2 :(得分:14)

你发现你也可以这样做:

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

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

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

    # filter and write
  }

答案 5 :(得分:2)

这一个班轮替换了所有^ M个字符:

dos2unix <file-name>

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:1)

这就解决了我的问题。 ^ M是回车符,可以在Perl脚本中轻松避免。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

在vi中点击:

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

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