![Remova os espaços em branco de todos os elementos do array](https://rvso.com/image/1127630/Remova%20os%20espa%C3%A7os%20em%20branco%20de%20todos%20os%20elementos%20do%20array.png)
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
sed
comandos 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 caracterese
,
No entanto, prefiro usar mapfile
uma 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 -z
a 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
-z
A opção faz comgrep
que 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) por
tr -d '[:space:]'
Como
IFS
está 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
}
ifVARIABLES
(vovar
) passadoif ($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