使用Perl,如何用逗号替换换行符?

时间:2009-07-14 07:21:59

标签: regex perl

我放弃了sed,我听说它在Perl中更好。

我想要一个可以从'unix'命令行调用的脚本,并从输入文件中转换DOS行结尾CRLF,并在输出文件中用逗号替换它们:

喜欢

myconvert infile > outfile

infile是:

1
2
3

并将导致outfile:

1,2,3

我更喜欢更明确的代码,对“最短的解决方案”进行一些最小的评论,所以我可以从中学习,我没有perl经验。

8 个答案:

答案 0 :(得分:26)

在shell中,你可以通过多种方式实现它:

cat input | xargs echo | tr ' ' ,

perl -pe 's/\r?\n/,/' input > output

我知道你希望这个更长,但我真的没有看到编写多行脚本来解决这么简单的任务 - 简单的regexp(在perl解决方案的情况下)是完全可行的,并且它不是人为的缩短 - 这是我每天用来解决手头问题的代码类型。

答案 1 :(得分:9)

#!/bin/perl
while(<>) {      # Read from stdin one line at a time
    s:\r\n:,:g;  # Replace CRLF in current line with comma
    print;       # Write out the new line
}

答案 2 :(得分:4)

use strict;
use warnings;

my $infile = $ARGV[0] or die "$0 Usage:\n\t$0 <input file>\n\n";
open(my $in_fh , '<' , $infile) or die "$0 Error: Couldn't open $infile for reading: $!\n";
my $file_contents;
{

    local $/; # slurp in the entire file. Limit change to $/ to enclosing block.
    $file_contents = <$in_fh>

}
close($in_fh) or die "$0 Error: Couldn't close $infile after reading: $!\n";

# change DOS line endings to commas
$file_contents =~ s/\r\n/,/g;
$file_contents =~ s/,$//; # get rid of last comma

# finally output the resulting string to STDOUT
print $file_contents . "\n";

您的问题文字和示例输出不一致。如果您要将所有行结尾转换为逗号,最后会在最后一行结尾处添加额外的逗号。但是您的示例仅显示数字之间的逗号。我假设您希望代码输出与您的示例匹配,并且问题文本不正确,但是如果您想要最后一个逗号,请删除注释“删除最后一个逗号”的行。

如果任何命令不明确,http://perldoc.perl.org/是你的朋友(右上角有一个搜索框)。

答案 3 :(得分:2)

这很简单:

tr '\n' , <infile >outfile

答案 4 :(得分:1)

避免啜饮,不要在尾随的逗号上打印并打印出格式正确的文本文件(所有行必须以换行符结尾):

#!/usr/bin/perl

use strict;
use warnings;

my $line = <>;

while ( 1 ) {
    my $next = <>;
    s{(?:\015\012?|\012)+$}{} for $line, $next;
    if ( length $next ) {
        print $line, q{,};
        $line = $next;
    }
    else {
        print $line, "\n";
        last;
    }
}
__END__

答案 5 :(得分:1)

就个人而言,我会避免不得不提前一行(如Sinar的回答)。有时你需要,但我有时在处理最后一行时做错了。

use strict;
use warnings;

my $outputcomma = 0;  # No comma before first line

while ( <> )
{
    print ',' if  $outputcomma ;
    $outputcomma = 1 ; # output commas from now on
    s/\r?\n$// ;
    print ;

}
print  "\n" ;

答案 6 :(得分:1)

顺便说一句:在sed中,它将是: sed ':a;{N;s/\r\n/,/;ba}' infile > outfile

答案 7 :(得分:0)

使用Perl

$\ = "\n";              # set output record separator
$, = ',';
$/ = "\n\n";

while (<>) {
    chomp;   
    @f = split('\s+', $_);
    print join($,,@f);
}
<\ n>在unix中,您还可以使用awk或tr等工具

awk 'BEGIN{OFS=",";RS=""}{$1=$1}1' file

tr "\n" "," < file