Agregar comillas dobles si hay espacios en blanco entre las palabras en la columna

Tengo un requisito para generar un file de una tabla. Estoy usando sed para transmitir los datos. Quiero usar un calificador de text si hay algún espacio en blanco en la columna de la tabla.

Entrada de muestra

Unites State | California | UNIX | ABC DE 

Rendimiento esperado

 "Unites State" | California | UNIX | "ABC DE" 

 $ echo 'Unites State | California | UNIX | ABC DE' | sed -E 's/([^ |]+ +[^|]+)( +\||$)/"\1"\2/g' "Unites State" | California | UNIX | "ABC DE" 
  • Asume que siempre hay un espacio antes |
  • -E utiliza ERE, algunas versiones sed usan -r lugar
  • ([^ |]+ +[^|]+) no espacio, no- | caracteres seguidos de al less un espacio y luego no- | caracteres
  • ( +\||$) encima del patrón seguido por al less un espacio y luego | o fin de línea
  • Cita "\1"\2 según el requisito

No está mal con Perl:

 echo $'Unites State | California | UNIX | ABC DE' |perl -pe 's/[a-zA-Z]+[[:space:]]+[a-zA-Z]+/\"$&\"/g' "Unites State" | California | UNIX | "ABC DE" 

POSIXly:

 sed 's/[^ |][^|]* [^|]*[^| ]/"&"/g' 

Para tener en count otros caracteres en blanco que el espacio ASCII, use:

 sed 's/[^[:blank:]|][^|]*[[:blank:]][^|]*[^|[:blank:]]/"&"/g' 

debido a que no puedo comentar, responde aquí.

 perl -pe 's/\w+\s+\w+/\"$&\"/g' 

es más simple para la respuesta de George Vasiliou.

En Perl, usaría 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 

Qué salidas:

 "Unites State" | California | UNIX | "ABC DE" 

Pero también hace frente a campos de palabras múltiples.

Simplificando esto en un trazador de líneas, porque todos los niños geniales son:

 perl -F'\s*\|\s*' -lane '/\s/&&s/(^|$)/\"/g for @F;print join " \| ",@F' 
 TAB=`echo 'x' | tr 'x' '\011'`; # tab SPC=`echo 'x' | tr 'x' '\040'`; # space s="[$SPC$TAB]"; # whitespace regex W="[^|$TAB$SPC]"; # building block of a word echo ' United States | California | UNIX|ABC DE' | sed -e "s/\($W$W*$s$s*\)\{1,\}[^|][^|]*/\"&\"/g"