37

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

4

11 回答 11

51

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

$str =~ s/\r//g
于 2009-03-16T14:51:33.377 回答
27

或 1 线:

perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
于 2009-03-16T16:36:04.203 回答
15

你发现你也可以这样做:

$line=~ tr/\015//d;
于 2009-03-16T17:36:39.533 回答
8

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

perl -p -i -e "s/\r\n/\n/g" file.name
于 2009-03-16T17:45:32.787 回答
6

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

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

    # filter and write
  }
于 2013-08-05T15:34:50.903 回答
3

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

dos2unix <file-name>

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

于 2012-08-03T23:04:29.990 回答
2

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

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

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

for ($line in <FILEHANDLE>) {
   $line =~ s/\r?\n$//;
}
于 2009-03-16T14:51:33.627 回答
1

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

while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
于 2016-03-17T06:57:53.787 回答
0

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

#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
于 2016-09-18T04:28:51.623 回答
0

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

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

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

于 2021-12-17T18:32:21.393 回答
-1

在 vi 中命中:

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

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

于 2009-03-16T17:45:19.933 回答