繁体   English   中英

Perl(或其他)-^ M问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM