Adicione aspas e novo delimitador em torno das palavras delimitadas por espaço

3

Eu tenho a seguinte string

y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis

Gostaria de transformar isso em

"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis"

Eu fiz algo parecido com o extremamente feio:

$ cat in.txt | sed 's/ /\'$'\n/g' | sed 's/\(.*\)/"",/g' | tr -d '\n'


"y10_zcis","y10_nom","y10_infl","y20_zcis","y20_infl","y30_zcis",

Mas isso parece um fracasso absoluto, e ele não cuida do último , indesejado (mas talvez seja melhor deletar depois)

    
por luffe 04.03.2016 / 19:34

6 respostas

5

Você pode fazer

sed -e 's| |", "|g' -e 's|^|"|g' -e 's|$|"|g' in.txt

Onde

  • 's| |", "|g' substituirá todos os espaços por ", "
  • 's|^|"|g' enquanto no começo não há espaço, você deve especificar com ^ o início da linha, então você está dizendo, coloque " no começo.
  • 's|$|"|g' mesma coisa, mas especificando o final de cada linha com $

UPDATE

Como @don_crissti apontou, você pode fazê-lo mais curto com o seguinte

sed 's| |", "|g;s|.*|"&"|'

Onde

  • ; separa cada instrução
  • .* corresponde à linha inteira.
  • & um "e comercial" no RHS é substituído pela expressão inteira correspondida no LHS, neste caso .*

    RHS = lado direito

    LHS = lado esquerdo

por 04.03.2016 / 19:36
5

Talvez awk

awk -vOFS=', ' '{for (k=1; k<=NF; ++k) $k="\""$k"\""; print}' file
"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis", "y30_nom", "y30_infl"
    
por 04.03.2016 / 19:38
3

Você pode fazer:

sed 's/\([^ ]\+\)/"",/g; s/,$//' file.txt

Exemplo:

% sed 's/\([^ ]\+\)/"",/g; s/,$//' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis'   
"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis"
    
por 04.03.2016 / 19:42
2

Usando o Perl:

perl -lane '$,=", "; foreach(@F) {s/^|$/"/g; push(@f, $_)}; print(@f)' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis'
  • $, = ", " : define o separador do campo de saída como , ;
  • foreach(@F) {s/^|$/"/g; push(@f, $_)} : para cada campo separado por espaço, coloca o campo entre aspas duplas e acrescenta @f ;
  • print(@f) : imprime os elementos de @f separados pelo separador do campo de saída.
% perl -lane '$,=", "; foreach(@F) {s/^|$/"/g; push(@f, $_)}; print(@f)' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis'
"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis"
%
    
por 04.03.2016 / 20:04
2

Supondo que você esteja usando o bash e sua string já esteja em uma variável:

$ a="y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis"
$ 

Então você pode fazer isso:

$ echo \"${a// /\", \"}\"
"y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis"
$ 
    
por 05.03.2016 / 07:39
1

Ainda outra maneira, usando o shell ( for , printf ) e uma% finalsed hack:

( for word in $(cat in.txt)
    do printf '"%s", ' $word; done; 
  printf '"\n' ) | 
  sed 's/, "$//'
    
por 04.03.2016 / 20:20