Astuce simple en une ligne pour vider un tableau
J'ai ajouté une valeur avec les espaces:
foo=()
foo[12]="bar"
foo[42]="foo bar baz"
foo[35]="baz"
Moi, pour vider rapidement frappertableaux ou tableaux associatifs que j'utilise
Cette commande en une ligne:
paste <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
Rendra:
12 bar
35 baz
42 foo bar baz
Expliqué
printf "%s\n" "${!foo[@]}"
imprimera toutes les clés séparées par une nouvelle ligne ,
printf "%s\n" "${foo[@]}"
affichera toutes les valeurs séparées par une nouvelle ligne ,
paste <(cmd1) <(cmd2)
fusionnera la sortie de cmd1
et cmd2
ligne par ligne.
Tunning
Cela pourrait être réglé par le -d
commutateur:
paste -d : <(printf "%s\n" "${!foo[@]}") <(printf "%s\n" "${foo[@]}")
12:bar
35:baz
42:foo bar baz
ou même:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[35]='baz'
foo[42]='foo bar baz'
Le tableau associatif fonctionnera de la même manière:
declare -A bar=([foo]=snoopy [bar]=nice [baz]=cool [foo bar]='Hello world!')
paste -d = <(printf "bar[%s]\n" "${!bar[@]}") <(printf '"%s"\n' "${bar[@]}")
bar[foo bar]="Hello world!"
bar[foo]="snoopy"
bar[bar]="nice"
bar[baz]="cool"
Problème avec les sauts de ligne ou les caractères spéciaux
Malheureusement, il y a au moins une condition qui empêche cela de fonctionner: lorsque la variable contient une nouvelle ligne:
foo[17]=$'There is one\nnewline'
La commande paste
fusionnera ligne par ligne, donc la sortie deviendra incorrecte:
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "'%s'\n" "${foo[@]}")
foo[12]='bar'
foo[17]='There is one
foo[35]=newline'
foo[42]='baz'
='foo bar baz'
Pour ce travail, vous pouvez utiliser à la %q
place de %s
dans la deuxième printf
commande (et whipe quote):
paste -d = <(printf "foo[%s]\n" "${!foo[@]}") <(printf "%q\n" "${foo[@]}")
Rendra parfait:
foo[12]=bar
foo[17]=$'There is one\nnewline'
foo[35]=baz
foo[42]=foo\ bar\ baz
De man bash
:
%q causes printf to output the corresponding argument in a
format that can be reused as shell input.
(a b c)
pour le convertir en tableau.