`set' in der shell: Bug?
A. Dreyer (LUG-OWL)
ml10227 at adreyer.com
Sat Jun 5 13:56:09 CEST 2010
On 02/06/10 11:50, Jan-Benedict Glaw wrote:
> On Tue, 2010-06-01 22:16:14 +0100, A. Dreyer (LUG-OWL) <ml10227 at adreyer.com> wrote:
>> On 01/06/10 13:19, Jan-Benedict Glaw wrote:
>>> Mit dem IFS hatte ich schon gespielt; das machts aber nicht unbedingt
>>> einfacher, weil dann z.B. kein Komma mehr in einem der C-Strings
>>> auftauchen darf. Ebenso würden Geschichten wie
>>>
>>> foo ("This is a text with a real (\") quotation mark", 5.3);
>>>
>>> nicht mehr ordentlich geparst werden.
>>
>> Ich denke für eine derartige Aufgabe ist die Shell eigentlich das
>> falsche Tool und ich würde hier auf Perl und zB. Text::CSV zurück greifen..
>
> Wie siehts da mit dem Escape-Handling aus? (/me hat keine Ahnung von
> Perl.)
>
> MfG, JBG
Das Escape-Handling würde ich hier dem Text::CSV module überlassen.
Abhängig vom Format der Rohdaten:
---------------------------------------------------------------------
$ cat test-data1.txt
foo ("This is a text with a real (\") quotation mark", 5.3);
::::::::::::::
test-function.pl
::::::::::::::
#!env perl
use strict;
use warnings;
use diagnostics;
use Text::CSV;
my $file = "test-data1.txt";
$file = $ARGV[0] if $ARGV[0];
my %csvparm = (
binary => 1,
sep_char => ',',
quote_char => '"',
escape_char => "\\",
empty_is_undef => 1,
allow_whitespace => 1,
eol => $/,
);
my $csv = Text::CSV->new (\%csvparm);
open my $io, "<", $file or die "$file: $!";
while (<$io>) {
my $line = $_;
$line =~ s/^[^\(]*\(//g;
$line =~ s/\)[^\)]*$//g;
my $status = $csv->parse($line);
next if !$status;
my @fields = $csv->fields();
for (@fields) {
print $_ . "\n" if defined($_);
}
}
$csv->eof or $csv->error_diag();
close $io;
exit 0;
---------------------------------------------------------------------
$ cat test-data2.txt
"This is a text with a real (\") quotation mark", 5.3
::::::::::::::
test-param.pl
::::::::::::::
#!env perl
use strict;
use warnings;
use diagnostics;
use Text::CSV;
my $file = "test-data.txt";
$file = $ARGV[0] if $ARGV[0];
my %csvparm = (
binary => 1,
sep_char => ',',
quote_char => '"',
escape_char => "\\",
# allow_loose_escapes => 1,
empty_is_undef => 1,
allow_whitespace => 1,
eol => $/,
);
my $csv = Text::CSV->new (\%csvparm);
open my $io, "<", $file or die "$file: $!";
while (my $row = $csv->getline ($io)) {
my @fields = @$row;
for (@fields) {
print $_ . "\n";
}
}
$csv->eof or $csv->error_diag();
close $io;
exit 0;
---------------------------------------------------------------------
Regards,
Achim Dreyer
--
Achim Dreyer || http://www.adreyer.com/
Network Security Consultant || Phone: +44 7756948229
Senior Unix & Network Admin || RHCE, RHCA, CCNA, CCSA, CCSE, CCSE+, CSCE
CAcert Assurer || JNCIS-FW
More information about the Linux
mailing list