OK, o problema com um 'perl one liner' como você nota:
perl -p -i -e 's/^/Welcome to Hell,/' file*.csv
Isso aplica uma transformação ao arquivo corretamente, mas perl 'lida' abrindo o (s) arquivo (s) e transmitindo-os através de STDIN
automagicamente. O que significa que você não sabe o nome do seu arquivo quando está fazendo isso.
A opção in place edit
( -i
) é uma conveniência, mas na verdade se torna um pouco mais difícil de usar efetivamente, já que você está potencialmente abrindo um arquivo para leitura e gravação simultaneamente.
De qualquer forma, eu abordaria seu problema assim:
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new( { binary => 1 } );
foreach my $filename ( glob("*.csv") ) {
open( my $output, ">", "new.$filename.csv" ) or warn $!;
open( my $input, "<", "$filename.csv" ) or warn $!;
while ( my $row = $csv->getline($input) ) {
if ( not $row->[0] eq m/$filename/ ) {
unshift( @{$row}, $filename );
}
$csv->print( $output, $row );
}
}
Ele usa o módulo Text::CSV
, porque na verdade o CSV é geralmente mais complicado do que apenas "dividido em vírgula" (pense em campos de várias linhas e vírgulas no texto).