Remova os espaços em branco de todos os elementos do array

Remova os espaços em branco de todos os elementos do array

Eu tenho um array chamado arrayvar, que está sendo definido como

arrayvar=( $(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{" ," ");gsub(","," ");print}' tr -d '\n' | sed 's/^[ \t]*//' | *$//') )

com

vovar=VARIABLES

Meu arquivo temporário tem algumas variáveis ​​que estou capturando usando o comando acima e os tr sedcomandos para remover espaços.
Arquivo TEMP

        ENTERPRISE eMylexRaidEventInformações
        VARIÁVEIS {
            a9EventCode,
            a9ControllerNumber,
            a9Número do canal,
            a9TargetNumber,
            a9LunNumber,
            a9EventTimeStamp
        }
 DESCRIÇÃO
 "dispositivo ficou online."

 --#SUMMARY "[Evento %d ctl %d chn %d tgt %d lun %d Tempo %d :] dispositivo ficou online."
 --#ARGUMENTOS {0,1,2,3,4,5}
 --#SEVERIDADE INFORMATIVA
         --#TIMEINDEX 5
 --#ESTADO OPERACIONAL
 ::= 1

Quando executo este comando apenas arrayvar[0]seus valores são removidos assim:

eco "${arrayvar[0]}"
a9EventCode

eco "${arrayvar[1]}"
            a9ControllerNumber

eco "${arrayvar[2]}"
            a9ChannelNumber

eco "${arrayvar[3]}"
            a9TargetNumber

Qualquer ajuda será apreciada. Obrigado!

Responder1

Você poderia usar isto:

var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
  • imprime todos os registros entre uma correspondência de registro VARIABLES {e uma correspondência de registro }, removendo todos os caracteres e,

No entanto, prefiro usar mapfileuma bifurcação única no lugar de uma bifurcação dupla para armazenar valores em uma matriz:

mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')

Responder2

Usando versões posteriores do GNU grep(vem com o Ubuntu) que possuem -za opção:

$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )

$ echo "${arrayvar[0]}"
a9EventCode

$ echo "${arrayvar[1]}"
a9ControllerNumber

$ echo "${#arrayvar[@]}"
6
  • -zA opção faz com grepque as linhas do texto de entrada sejam separadas por ASCII NUL em vez de novas linhas para que possamos combinar as novas linhas literalmente.

  • O padrão PCRE \s+VARIABLES\s+{\K[^}]+(?=})corresponderá ao texto dentro{}

  • Em seguida, removemos os espaços em branco (espaço, tabulação, nova linha) portr -d '[:space:]'

  • Como IFSestá definido como ,podemos criar o array com strings separadas por vírgula.

Responder3

Faça tudo com awk conforme abaixo:

arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))

Responder4

Usandoperl

perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' <your_input_file>

Explicação

  • exit if ($start == 1 && /}/ );

    Saia do script se houver um }if VARIABLES( vovar) passado

  • if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}

    Imprima a linha se VARIABLES( vovar) for passado

  • $start=1 if (/'"$vovar"'/)

    Defina o marcador inicial se VARIABLES( vovar) for passado


Exemplo

$ vovar=VARIABLES
$ arrayvar=($(perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' foo))
$ for((i=0;i<${#arrayvar[@]};i++)); do echo "${arrayvar[i]}"; done
a9EventCode
a9ControllerNumber
a9ChannelNumber
a9TargetNumber
a9LunNumber
a9EventTimeStamp


$ cat foo
        ENTERPRISE eMylexRaidEventInformation
        VARIABLES {
            a9EventCode,
            a9ControllerNumber,
            a9ChannelNumber,
            a9TargetNumber,
            a9LunNumber,
            a9EventTimeStamp
        }
 DESCRIPTION
 "device became online."

 --#SUMMARY "[Event %d ctl %d chn %d tgt %d lun %d Time %d :] device became online."
 --#ARGUMENTS {0,1,2,3,4,5}
 --#SEVERITY INFORMATIONAL
         --#TIMEINDEX 5
 --#STATE OPERATIONAL
 ::= 1

informação relacionada