![Eliminar espacios en blanco de todos los elementos de la matriz](https://rvso.com/image/1127630/Eliminar%20espacios%20en%20blanco%20de%20todos%20los%20elementos%20de%20la%20matriz.png)
Tengo una matriz llamada arrayvar
, que se define como
arrayvar=( $(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{" ," ");gsub(","," ");print}' temp1 | tr -d '\n' | sed 's/^[ \t]*//' | sed 's/[ \t] *$//') )
con
vovar=VARIABLES
Mi archivo temporal tiene algunas variables que estoy tomando usando el comando anterior y los tr
sed
comandos para eliminar espacios.
archivo TEMP
EMPRESA eMylexRaidEventInformación VARIABLES { a9 código de evento, a9Número de controlador, a9 número de canal, a9número de destino, a9NúmeroLun, a9EventTimeStamp } DESCRIPCIÓN "el dispositivo se puso en línea". --#SUMMARY "[Evento %d ctl %d chn %d tgt %d lun %d Hora %d :] el dispositivo se puso en línea". --#ARGUMENTOS {0,1,2,3,4,5} --#SEVERIDAD INFORMATIVA --#ÍNDICE DE TIEMPO 5 --#ESTADO OPERATIVO ::= 1
Cuando ejecuto este comando solo arrayvar[0]
se eliminan sus valores de esta manera:
eco "${arrayvar[0]}" a9Código de evento eco "${arrayvar[1]}" a9Número de controlador eco "${arrayvar[2]}" a9Número de canal eco "${arrayvar[3]}" a9Número de destino
Cualquier ayuda será apreciada. ¡Gracias!
Respuesta1
Podrías usar esto:
var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
- imprime todos los registros entre una coincidencia de registros
VARIABLES {
y una coincidencia de registros}
, eliminando todos los caracteresy
,
Sin embargo, prefiero usar mapfile
una bifurcación única en lugar de una bifurcación doble para almacenar valores en una matriz:
mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')
Respuesta2
Usando versiones posteriores de GNU grep
(viene con Ubuntu) que tiene -z
la opción:
$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )
$ echo "${arrayvar[0]}"
a9EventCode
$ echo "${arrayvar[1]}"
a9ControllerNumber
$ echo "${#arrayvar[@]}"
6
-z
La opción hacegrep
que las líneas de texto de entrada se traten separadas por ASCII NUL en lugar de nuevas líneas para que podamos hacer coincidir las nuevas líneas literalmente.El patrón PCRE
\s+VARIABLES\s+{\K[^}]+(?=})
coincidirá con el texto del interior.{}
Luego hemos eliminado los espacios en blanco (espacio, tabulación, nueva línea) mediante
tr -d '[:space:]'
Como
IFS
está configurado,,
podemos crear la matriz con cadenas separadas por comas.
Respuesta3
Haga todo con awk como se muestra a continuación:
arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))
Respuesta4
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>
Explicación
exit if ($start == 1 && /}/ );
Salga del script si se pasa un
}
ifVARIABLES
(vovar
)if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}
Imprima la línea si se pasa
VARIABLES
( )vovar
$start=1 if (/'"$vovar"'/)
Establezca el marcador de inicio si se pasa
VARIABLES
( )vovar
Ejemplo
$ 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