[英]Perl (or something else) - ^M problem
我正在尝试在Perl中文本文件的每个非空行的末尾添加"
和",
。
perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt
它在每个非空行的开头都添加了"
,但是我有问题",
。
输入示例:
bla
bla bla
blah
我得到的输出是:
"bla
",
"bla bla
",
"blah
",
那就是我真正想要的输出 :
"bla",
"bla bla",
"blah",
我该如何解决?
编辑:我现在在vim中打开了我的输出文件(我之前在kwrite中打开了它,所以它不可见),并且我注意到vim在每个",
之前显示^M
",
-我不知道代码中添加了什么。
看起来像是行尾问题-您是否在Windows中编辑文件? 试试dos2unix
如果您不想使用dos2unix,则可以匹配\\ r:
perl -pi -e 's/^(.+)\r$/\"$1\",/g'
问题是,如果文件中有返回值,它将在。*中匹配它们,因此您将获得:
"bla^M",
"bla bla^M",
"blah^M",
您的数据文件必须起源于Windows,Windows使用CRLF作为行定界符,而不仅仅是LF。 这意味着您的文本文件如下所示:
bla[CR][LF]bla bla[CR][LF]blah[CR][LF]
您可以使用od -c something.txt
进行验证。
$ od -c something.txt
0000000 b l a \r \n b l a b l a \r \n b l
0000020 a h \r \n
0000024
在Unix或Linux下,它将显示如下:
bla\r
bla bla\r
blah\r
当perl进行替换时,结果如下:
"bla\r",
"bla bla\r",
"blah\r",
当您获得结果时,您将看到:
"bla
",
"bla bla
",
"blah
",
容易做的是使用dos2unix将行尾转换为Unix格式,然后您的脚本将按预期运行。
在使用CRLF文本文件的系统上,Perl使用IO层将CRLF过滤为仅在脚本中看到LF的位置。 但是,如果您在通常不使用CRLF的系统上打开CRLF文件,则可以通过多种方式启用CRLF转换。
您可以使用binmode 。 我在这里使用OO接口,因为我认为它更干净,YMMV:
use IO::File;
open( my $fh, '<', 'winfile.txt' )
or die "Oh poo - $!\n";
$fh->binmode(':crlf');
您还可以使用经过调整的打开:
open( my $fh, '<:crlf', 'winfile.txt' )
or die "Oh poo - $!\n";
或者,对于单行代码,您可以设置PERLIO环境变量(请参见PerlIO ):
PERLIO=crlf perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt
当然,这种方法会将CRLF行尾保留在处理后的文件中-可能不是您想要的。
sed 's/.\{1,\}/"&",/'
这是在python或bash之前询问的-在行首添加“,在行尾添加”
由于您想在开始和结束时添加,因此您无需用正则表达式替代该简单任务。
perl -ne 'chomp;print "\"".$_."\",\n"' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.