我有一个文件,使用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
有人知道达到我目标的优雅方法吗?
答案 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
来替换多个发生。