Lors de l'exécution d'une commande, j'obtiens 10 lignes de sortie. Je veux prendre les lignes 2-4-6-8-10 et les mettre dans un tableau.
Chaque fois que j'exécute ma commande, l'ordre change, je dois donc le faire en une seule fois. J'avais essayé d'exécuter ma commande et de sélectionner la ligne 2, puis de relancer et de sélectionner la ligne 4, etc., mais comme l'ordre change, cela ne fonctionne pas :
value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')
MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")
Réponse acceptée :
Utilisation de readarray
dans le bash
shell et GNU sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
Le readarray
intégré lit les lignes dans un tableau. Les lignes sont lues à partir d'une substitution de processus. Le sed
la commande dans la substitution de processus n'affichera qu'une ligne sur deux lue à partir de my_command
(et pourrait aussi s'écrire sed '1!n;d'
, ou comme sed -n 'n;p'
avec sed
standard ).
Dans GNU sed
, l'adresse n~m
adresses tous les m
:ème ligne commençant à la ligne n
. Il s'agit d'une extension GNU du standard sed
, pour plus de commodité.
Le my_command
la commande ne sera appelée qu'une seule fois.
Test :
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10