No perl, eu realmente usaria split
:
#!/usr/bin/env perl
use strict;
use warnings;
#iterate data block below (use <> for reading STDIN)
while ( <DATA> ) {
#split on whitespace|whitespace
my @fields = split /\s*\|\s*/;
#transform individual fields
for ( @fields ) {
#check if it contains a space
next unless m/\s/;
#if it does, quote
s/(^|$)/\"/g;
}
#print output;
print join " \| ", @fields,"\n";
}
__DATA__
Unites State | California | UNIX | ABC DE
Quais resultados:
"Unites State" | California | UNIX | "ABC DE"
Mas também lida com campos de várias palavras.
Simplificando isso para um forro único, porque todas as crianças legais são:
perl -F'\s*\|\s*' -lane '/\s/&&s/(^|$)/\"/g for @F;print join " \| ",@F'