Při spuštění příkazu dostanu 10 řádků výstupu. Chci vzít řádky 2-4-6-8-10 a vložit je do pole.
Pokaždé, když spustím svůj příkaz, pořadí se změní, takže to musím udělat najednou. Zkoušel jsem spustit svůj příkaz a vybrat řádek 2, pak znovu spustit a vybrat řádek 4 atd., ale protože se pořadí mění, nefunguje to:
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}")
Přijatá odpověď:
Pomocí readarray
v bash
shell a GNU sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
Vestavěné readarray
přečte řádky do pole. Řádky jsou čteny ze substituce procesu. sed
příkaz v substituci procesu vypíše pouze každý druhý řádek přečtený z my_command
(a může být také napsáno sed '1!n;d'
, nebo jako sed -n 'n;p'
se standardním sed
).
V GNU sed
, adresu n~m
adresy každých m
:-tý řádek začínající na řádku n
. Toto je GNU rozšíření standardního sed
, pro pohodlí.
my_command
příkaz bude vždy volán pouze jednou.
Testování:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10