Eliminar espacios en blanco de todos los elementos de la matriz

Eliminar espacios en blanco de todos los elementos de la matriz

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 sedcomandos 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 caracteres y,

Sin embargo, prefiero usar mapfileuna 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 -zla 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
  • -zLa opción hace grepque 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) mediantetr -d '[:space:]'

  • Como IFSestá 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 }if VARIABLES( 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

información relacionada