web-dev-qa-db-fra.com

Supprimer les espaces de tous les éléments du tableau

J'ai un tableau appelé arrayvar, qui est défini comme

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

avec

vovar=VARIABLES

Mon fichier temporaire contient des variables que je récupère à l’aide de la commande ci-dessus et des commandes trsed pour supprimer les espaces.
Fichier TEMP

 ENTERPRISE eMylexRaidEventInformation 
 VARIABLES {
 A9EventCode, 
 A9ControllerNumber, 
 A9ChannelNumber, 
 A9TargetNumber, 
 .9. .____.] a9EventTimeStamp 
} 
 DESCRIPTION 
 "L'appareil est devenu en ligne." 
 
 - # SUMMARY "[Événement% d ctl% d chn% d tgt% d lun% d Heure% d:] l’appareil est devenu en ligne. "
 - # ARGUMENTS {0,1,2,3,4,5} 
 - # GRAVITÉ INFORMATIONS 
 - # TIMEINDEX 5 
 - # ÉTATS OPÉRATIONNELS 
 :: = 1 

Lorsque j'exécute cette commande, seul arrayvar[0] est dépouillé de ses valeurs, comme ceci:

 echo "$ {arrayvar [0]}" 
 a9EventCode 
 
 echo "$ {arrayvar [1]}" 
 a9ControllerNumber 
 
 echo "$ {arrayvar [2]}" ". .____.]

Toute aide serait appréciée. Merci!

2
SamFlynn

Vous pouvez utiliser ceci:

var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
  • imprime chaque enregistrement entre un enregistrement correspondant VARIABLES { et un enregistrement correspondant }, en supprimant chaque caractère et ,

Cependant, je préférerais utiliser mapfile et un seul fork à la place d'un double fork pour stocker les valeurs dans un tableau:

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

Utilisation de versions ultérieures de GNU grep (fourni avec Ubuntu) comportant l’option -z:

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

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

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

$ echo "${#arrayvar[@]}"
6
  • L'option -z permet à grep de traiter les lignes du texte saisi séparées par ASCII NUL au lieu des nouvelles lignes afin que nous puissions les relier à la lettre.

  • Le modèle PCRE \s+VARIABLES\s+{\K[^}]+(?=}) correspondra au texte à l'intérieur {}

  • Ensuite, nous avons supprimé les espaces (espace, tabulation, nouvelle ligne) de tr -d '[:space:]'

  • Comme IFS est défini sur ,, nous pouvons créer le tableau avec des chaînes séparées par des virgules.

1
heemayl

Faites tout avec awk comme ci-dessous:

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

Utiliser Perl

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>

Explication

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

    Quittez le script s'il existe un } si VARIABLES (vovar) est passé

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

    Imprimer la ligne si VARIABLES (vovar) est passé

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

    Définit le marqueur de départ si VARIABLES (vovar) est passé


Exemple

$ 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
1
A.B.