Adicione aspas duplas se houver espaço em branco entre as palavras na coluna

2

Eu tenho um requisito para gerar um arquivo de uma tabela. Estou usando sed para transmitir os dados. Eu quero usar um qualificador de texto se houver algum espaço em branco na coluna da tabela.

Entrada de amostra

Unites State | California | UNIX | ABC DE

Saída esperada

"Unites State" | California | UNIX | "ABC DE"
    
por Rajesh 23.03.2017 / 05:29

6 respostas

1

$ echo 'Unites State | California | UNIX | ABC DE' | sed -E 's/([^ |]+ +[^|]+)( +\||$)/""/g'
"Unites State" | California | UNIX | "ABC DE"
  • Pressupõe que sempre haja um espaço antes de |
  • -E usa ERE, algumas sed usam -r
  • ([^ |]+ +[^|]+) não espaço, não | caracteres seguidos por pelo menos um espaço e, em seguida, não | caracteres
  • ( +\||$) acima do padrão seguido por pelo menos um espaço e, em seguida, | ou fim da linha
  • "" citação conforme o requisito
por 23.03.2017 / 06:17
1

Nada mal com o 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"
    
por 27.03.2017 / 14:55
1

POSIXly:

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

Para contabilizar outros caracteres em branco do que o espaço ASCII, use:

sed 's/[^[:blank:]|][^|]*[[:blank:]][^|]*[^|[:blank:]]/"&"/g'
    
por 27.03.2017 / 15:05
0

por não poder comentar, responda aqui.

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

é mais simples para a resposta de George Vasiliou.

    
por 27.03.2017 / 15:02
0

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'
    
por 27.03.2017 / 15:39
0
TAB='echo 'x' | tr 'x' '1''; # tab
SPC='echo 'x' | tr 'x' '0''; # 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"
    
por 23.03.2017 / 09:57