Используя Perl, как я могу заменить символы новой строки запятыми? - PullRequest
6 голосов
/ 14 июля 2009

Я отказался от sed и слышал, что в Perl лучше.

Я хотел бы, чтобы скрипт вызывался из командной строки 'unix' и преобразовывал окончания строки DOS CRLF из входного файла и заменял их запятыми в выходном файле:

как

myconvert infile > outfile

, где был infile:

1
2
3

и приведет к выходному файлу:

1,2,3

Я бы предпочел более явный код с некоторыми минимальными комментариями, чем «самое короткое из возможных решений», поэтому я могу извлечь из него у меня опыт работы с perl.

Ответы [ 8 ]

26 голосов
/ 14 июля 2009

В оболочке вы можете сделать это разными способами:

cat input | xargs echo | tr ' ' ,

или

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

Я знаю, что вы хотели, чтобы это было длиннее, но я не вижу смысла в написании многострочного скрипта для решения такой простой задачи - простое регулярное выражение (в случае решения perl) полностью работоспособно, и это не что-то искусственное сокращенный - это тип кода, который я бы использовал ежедневно для решения данной проблемы.

9 голосов
/ 14 июля 2009
#!/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
}
4 голосов
/ 14 июля 2009
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/ - ваш друг (в правом верхнем углу есть окно поиска).

2 голосов
/ 16 июля 2009

Это так же просто, как:

tr '\n' , <infile >outfile
1 голос
/ 04 июня 2013

Кстати: в седе это будет: sed ':a;{N;s/\r\n/,/;ba}' infile > outfile

1 голос
/ 15 июля 2009

Лично я бы не стал смотреть вперед (как в ответе Синара). Иногда вам нужно, но я иногда делал ошибки при обработке последней строки.

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" ;
1 голос
/ 14 июля 2009

Избегайте ласкания, не вставляйте запятую и печатайте правильно сформированный текстовый файл (все строки должны заканчиваться символами новой строки):

#!/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__
0 голосов
/ 14 июля 2009

с Perl

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

while (<>) {
    chomp;   
    @f = split('\s+', $_);
    print join($,,@f);
}

в Unix, вы также можете использовать такие инструменты, как awk или tr

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

или

tr "\n" "," < file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...