在 Perl 中,如何从文件中删除 ^M?
Posted
技术标签:
【中文标题】在 Perl 中,如何从文件中删除 ^M?【英文标题】:In Perl, how to remove ^M from a file? 【发布时间】:2010-10-13 15:19:57 【问题描述】:我有一个将新字段附加到现有 CSV 的脚本,但是 ^M
字符出现在旧行的末尾,因此新字段最终位于新行而不是同一行。如何使用 Perl 从 CSV 文件中删除 ^M
字符?
【问题讨论】:
使用binmode(STDIN, ":crlf")
或PERLIO=:unix:crlf
(参见[***.com/a/21320709/424632])。
【参考方案1】:
^M 是回车。你可以这样做:
$str =~ s/\r//g
【讨论】:
【参考方案2】:将 DOS 样式转换为 UNIX 样式的行尾:
for ($line in <FILEHANDLE>)
$line =~ s/\r\n$/\n/;
或者,删除 UNIX 和/或 DOS 样式的行尾:
for ($line in <FILEHANDLE>)
$line =~ s/\r?\n$//;
【讨论】:
不会也删除换行符吗? 我想这取决于你的目标。我进行了编辑以显示这两种策略。【参考方案3】:或 1-liner:
perl -p -i -e 's/\r\n$/\n/g' file1.txt file2.txt ... filen.txt
【讨论】:
很容易记住这个是 Perl Pie。 在 Windows 上使用此命令传递 *.txt 不起作用。它给出:无法打开 *.txt:参数无效。有人吗? 不需要全局 'g' 因为 '$' 只匹配行尾。【参考方案4】:你发现你也可以这样做:
$line=~ tr/\015//d;
【讨论】:
不像\r
那样可读性 - 任何看到它的人(或一年后的你自己)都会很高兴看到评论说明它的作用【参考方案5】:
在 vi 中点击:
。
然后s/Control-VControl-M//g
。
Control-V
Control-M
显然是那些键。不要拼出来。
【讨论】:
在这样的源代码中逐字包含非打印字符(如回车)是一个坏主意。使用 \r 转义要好得多,它 (a) 易于查看并且 (b) 如果重新格式化源代码也不会丢失。【参考方案6】:有点不相关,但要使用 Perl 从命令行中删除 ^M,请执行以下操作:
perl -p -i -e "s/\r\n/\n/g" file.name
【讨论】:
【参考方案7】:这一行替换所有 ^M 字符:
dos2unix <file-name>
您可以从 Perl 内部或直接在 Unix 提示符下调用它。
【讨论】:
【参考方案8】:我更喜欢使用 DOS 或 Unix 输入的更通用的解决方案。假设输入来自 STDIN:
while (defined(my $ln = <>))
chomp($ln);
chop($ln) if ($ln =~ m/\r$/);
# filter and write
【讨论】:
【参考方案9】:这就是解决我的问题的方法。 ^M 是回车,在 Perl 脚本中很容易避免。
while(<INPUTFILE>)
chomp;
chop($_) if ($_ =~ m/\r$/);
【讨论】:
这会从 CSV 文件中删除 ^M 吗?更改输入文件?它会创建一些没有它们的输出文件吗?【参考方案10】:我有一个小脚本。对其进行修改有助于过滤掉跨平台遗留文件中的一些其他不可打印字符。
#!/usr/bin/perl
# run this as
# convert_dos2unix.pl < input_file > output_file
undef $/;
$_ = <>;
s/\r//ge;
print;
【讨论】:
【参考方案11】:perl 命令将 dos 行结尾转换为以原始文件备份结尾的 unix 行:
perl -pi.bak -e 's/\r\n/\n/g' filename
此命令生成带有 unix 行结尾的文件名,并将原始文件保留为 filename.bak。
【讨论】:
以上是关于在 Perl 中,如何从文件中删除 ^M?的主要内容,如果未能解决你的问题,请参考以下文章