Usando Sed e Ampersand Substituição com Array

1

Eu estou tentando usar o caractere e comercial de sed para substituir a seqüência de caracteres original e, em seguida, ler a matriz, mas não está funcionando. Acabei de receber o erro: 'operando esperado (token de erro é' & ") '.

Aqui está a linha de código relevante:

gawk -F '\t' '{ print $5"\t"$1"\t"$2"\t"$3"\t"$4 }' $TEMPFILE | sed "s/^[0-9]\+/${CATEGORY[&]}/g"

A primeira declaração gawk produz um número de dois dígitos no início da linha. Se eu substituir o e comercial na instrução sed com esse número manualmente, tudo funciona. Eu realmente aprecio alguma ajuda.

    
por Sarah C. Corriher 19.01.2016 / 14:14

2 respostas

3

O problema é que o shell expande primeiro a cadeia de aspas duplas e, em seguida, envia a string expandida como um parâmetro para sed. Sed não sabe como expandir variáveis de shell, no entanto.

Você deve conseguir fazer isso em awk diretamente, embora:

category=(red amber green)
awk -f <( # This generates the awk code:
          echo '{';
          for (( i=0; i<${#category[@]}; i++ )) ; do
              echo category"[$i]"=\"${category[$i]}\"
          done
          echo 'print $1, category[$1]}'
      ) <( # This is the input file. 
          echo 0; echo 1 ; echo 2 )
    
por 19.01.2016 / 14:36
1

Como choroba apontou, seu problema é que seu shell tentará expandir ${CATEGORY[something]} antes de passá-lo para sed.

Se você deseja fazer isso com um pipe do awk para o sed, essa é uma solução alternativa:

awk ... | sed 's/^[0-9]\+/echo ${CATEGORY[&]}/g' | bash

Funciona usando sed para construir instruções de shell que leem o array. Isso ainda funcionará somente se a matriz for exportada.

Você também pode tentar

eval $(awk ... | sed 's/^[0-9]\+/echo ${CATEGORY[&]}/g')

que também funcionará sem o array ser exportado.

Eu não recomendaria nenhuma solução, a menos que você tenha 100% de certeza de que seu script sed não pode produzir nenhum comando perigoso (mesmo que a entrada para o awk seja maliciosa).

    
por 20.01.2016 / 20:28

Tags