如何在Perl脚本中从文件中删除所有换行符?

时间:2018-11-25 18:24:25

标签: file perl

我有一个文件,使用vi:set list进行查看时,该文件如下所示:

one^M$
two$
three$^M
four$

我想从perl脚本中删除文件中的所有换行符($)。因此文件应如下所示:

one^Mtwothree^Mfour

之后,我想用换行符(^M)替换CR(\n),但这是另一回事了……

我尝试了以下代码:

#!/usr/bin/perl
use strict;
use warnings;
my $file = "test.txt";
system("sed -i ':a;N;$!ba;s/\n//g' $file");
exit 0;

我知道使用system是很丑陋的,但是这个错误让我受了惩罚:

sed: -e expression #1, char 10: unterminated `s' command

有人知道达到我目标的优雅方法吗?

1 个答案:

答案 0 :(得分:4)

如果您已经在使用Perl,则不必使用sed。 Perl有一个-i开关,可以简化这种事情。

perl -pi -e's/\n//' test.txt

或者Path::Tiny提供的功能等效于-i

use strict;
use warnings;
use Path::Tiny;
my $file = shift; # get filename from argument
path($file)->edit_lines(sub { s/\n// });

在两种情况下都将对每行执行替换,这应该没问题,因为该行包含其尾随的换行符。您可以通过将-0777传递到oneliner,或使用->edit而不是->edit_lines一次在整个文件上执行,那么您想使用s/\n//g来替换多个发生。