请教一个关于字符串解析的问题

请教一个关于字符串解析的问题

有一个文本文件,field之间通过空格进行分隔,但也有可能一个被双引号包含的field内部包含空格,例如:
$ cat testfile
A B "a b c" D E
A "a b c" "a b c" D E

现在我希望得到每行记录的第二个field,也就是:
B
"a b c"

请问有什么简单的命令得到这个结果?awk/shell/perl都行。

谢谢!
先扫描一遍,把引号里的空格用特殊字符替换一下,
取完第二个field之后再把特殊字符替换回来。
谢谢!
是一个不错的想法,不知有没有其他更好的方法?因为我上面例子中的空格、双引号在实际应用中可能变化。我希望有一种更简单、高效的方法。
print (((/\w+|".*?"/g)[1]), "\n") while (<DATA>);
__DATA__
A B "a b c" D E
A "a b c" "a b c" D E


不知道满足要求否?

似乎可以。但我将分隔符换成逗号,怎么就不行了呢?

$ cat my2.pl
print (((/,|".*?"/g)[1]), "\n") while (<DATA>);
__DATA__
A,B,"a,b,c",D, E
A,"a,b,c","a,b,c",D,E

$ perl my2.pl
,
"a,b,c"
你改你的文件格式,你别改那个正则式啊
不好意思,你的正则表达式似乎不能处理以下这种情况:
$ cat my2.pl
print (((/\w+|".*?"/g)[1]), "\n") while (<DATA>);
__DATA__
A1 A2,B1 B2,"a,b,c",D, E
A,"a,b,c","a,b,c",D,E

$ perl my2.pl
A2
"a,b,c"

我期望得到的是:
B1 B2
"a,b,c"

谢谢!


[Copy to clipboard] [ - ]
CODE:
print (((/[\w\s]+|".*?"/g)[1]), "\n") while (<DATA>);
__DATA__
A1 A2,B1 B2,"a,b,c",D, E
A,"a,b,c","a,b,c",D,E

拜托,把你可能出现的情况都说出来,别一个一个来
Try this for complicated way:

[Copy to clipboard] [ - ]
CODE:
sub split_string {
     my $text = shift;
     my $new_aref = [];
     push(@$new_aref, $+) while $text =~ m{ \s*(
         # groups the phrase inside double quotes
         "([^\"\\]*(?:\\.[^\"\\]*)*)"\s*,?
         # groups the phrase inside single quotes
         | '([^\'\\]*(?:\\.[^\'\\]*)*)'\s*,?
         # trims leading/trailing space from phrase
         | ([^,\s]+(?:\s+[^,\s]+)*)\s*,?
         # just to grab empty phrases
        | (),
    )\s*}gx;
    push(@$new_aref, undef) if $text =~ m/,\s*$/;
    return $new_aref;
}

# test
my $rec = split_string(q/1,2,3,",1,2", '2,3'/);
foreach (@$rec) {
    print " part: >>" . (defined($_) ? $_ : '') . "<<\n";
}


For simple way to use DBD::CSV

我错了