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

发布于 2024-07-15 07:47:29 字数 121 浏览 10 评论 0原文

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

I have a script that is appending new fields to an existing CSV, however ^M characters are appearing at the end of the old lines so the new fields end up on a new row instead of the same one. How do I remove ^M characters from a CSV file using Perl?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

东走西顾 2024-07-22 07:47:29

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

$str =~ s/\r//g

^M is carriage return. You can do this:

$str =~ s/\r//g
赏烟花じ飞满天 2024-07-22 07:47:29

或者 1 行:

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

Or a 1-liner:

perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
卖梦商人 2024-07-22 07:47:29

您发现您还可以这样做:

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

You found out you can also do this:

$line=~ tr/\015//d;
阿楠 2024-07-22 07:47:29

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

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

Slightly unrelated, but to remove ^M from the command line using Perl, do this:

perl -p -i -e "s/\r\n/\n/g" file.name
〃温暖了心ぐ 2024-07-22 07:47:29

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

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

    # filter and write
  }

I prefer a more general solution that will work with either DOS or Unix input. Assuming the input is from STDIN:

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

    # filter and write
  }
年少掌心 2024-07-22 07:47:29

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

dos2unix <file-name>

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

This one liner replaces all the ^M characters:

dos2unix <file-name>

You can call this from inside Perl or directly on your Unix prompt.

静待花开 2024-07-22 07:47:29

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

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

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

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

To convert DOS style to UNIX style line endings:

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

Or, to remove UNIX and/or DOS style line endings:

for ($line in <FILEHANDLE>) {
   $line =~ s/\r?\n$//;
}
终难遇 2024-07-22 07:47:29

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

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

This is what solved my problem. ^M is a carriage return, and it can be easily avoided in a Perl script.

while(<INPUTFILE>)
{
     chomp;
     chop($_) if ($_ =~ m/\r$/);
}
静若繁花 2024-07-22 07:47:29

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

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

Little script I have for that. A modification of it helped to filter out some other non-printable characters in cross-platform legacy files.

#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
み格子的夏天 2024-07-22 07:47:29

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

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

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

perl command to convert dos line ending to unix line ending with backup of the original file:

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

This command generates filename with unix line ending and leaves the original file as filename.bak.

情话难免假 2024-07-22 07:47:29

在 vi 中点击 :

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

Control-V Control-M 显然就是这些键。 别把它拼出来。

In vi hit :.

Then s/Control-VControl-M//g.

Control-V Control-M are obviously those keys. Don't spell it out.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文