Donc, si j'ai une variable
VAR='10 20 30 40 50 60 70 80 90 100'
et l'écho
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
Cependant, plus bas dans le script, j'ai besoin d'inverser l'ordre de cette variable pour qu'elle s'affiche comme quelque chose comme
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
J'ai essayé d'utiliser rev et il a littéralement inversé tout ce qui est sorti
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
Réponses:
Sur les systèmes GNU, l'inverse de cat est tac:
la source
echo $'100 \n90 80 70 60 50 40 30 20 10'
tac -s" " <<< "$VAR "
version actuelle , il insère toujours une ligne vide de tête, ajoute un espace de fin et omet le caractère de fin de ligne (comme siprintf '\n%s ' "$reversed_VAR"
au lieu de prévuprintf '%s\n' "$reversed_VAR"
)echo $(tac -s" " <<< $VAR)
n'a pas d'espace de fin car le$(…)
supprime les nouvelles lignes et les espaces de fin si l'IFS en a. Ma solution sera bientôt corrigée, merci.Pour une courte liste, et dans une variable, le shell lui-même est la solution la plus rapide:
Production:
Remarque: l'opération de division dans
set -- $var
est sûre pour la chaîne exacte utilisée ici, mais ne le sera pas si la chaîne contient des caractères génériques (*
,?
ou[]
). Il peut être évité avecset -f
avant la séparation, si nécessaire. La même note est également valable pour les solutions suivantes (sauf indication contraire).Ou, si vous souhaitez définir une autre variable avec la liste inversée:
Ou en utilisant uniquement les paramètres de position.
Ou en utilisant une seule variable (qui peut être var elle-même):
Remarque: Cette solution n'est pas affectée par la globalisation ni par IFS.
la source
awk
à la rescousseavec
perl
, courtoisie Comment lire une adresse IP à l'envers? partagé par @steeldriverOu, avec
bash
lui-même en convertissant la chaîne en tableaula source
Vous pouvez utiliser des fonctionnalités bash telles que des tableaux pour le faire entièrement en cours:
Cela devrait être le moyen le plus rapide de le faire à condition que $ VAR ne soit pas très très grand.
la source
VAR='+ * ?'
). Utilisezset -o noglob
ouset -f
pour corriger cela. Plus généralement, c'est une bonne idée de considérer la valeur$IFS
et l'état de la globalisation lors de l'utilisation de l'opérateur split + glob. Non, cela n'a pas de sens d'utiliser cet opérateurrev_a+=( ${a[$i]} )
,rev_a+=( "${a[$i]}" )
aurait beaucoup plus de sens.la source
Utilisez un peu de magie Python ici:
La façon dont cela fonctionne est assez simple:
"$VAR"
le secondsys.argv[1]
paramètre de ligne de commande (le premier paramètre avec-c
option est toujours juste cela --c
lui - même. Remarquez les guillemets"$VAR"
pour éviter de diviser la variable elle-même en mots individuels (ce que hisi fait par shell, pas par python).split()
méthode, pour le diviser en une liste de chaînes[::-1]
une partie est simplement une syntaxe de tranche étendue pour obtenir l'inverse de la liste" ".join()
et imprimonsMais ceux qui ne sont pas de grands fans de Python, nous pourrions utiliser
AWK
essentiellement la même chose: diviser et imprimer le tableau à l'envers:la source
python3 -c 'import sys;print(*reversed(sys.argv[1:]))' $VAR
$IFS
contient les caractères appropriés et sans désactiver la partie glob."$VAR"
rendementspython3 -c 'import sys;print(*reversed(sys.argv[1].split()))' "$VAR"
zsh
:$=VAR
se divise$VAR
sur$IFS
.(Oa)
ordonne la liste résultante dans l'ordre inverse des tableaux.print -r --
(comme dansksh
), de même queecho -E -
(zsh
spécifique) est une version fiable deecho
: affiche ses arguments comme-est séparé par un espace, terminé par une nouvelle ligne.Si vous souhaitez diviser uniquement sur l'espace, et non sur tout ce qui
$IFS
contient (espace, tabulation, nouvelle ligne, nul par défaut), affectez de l'espace à$IFS
, ou utilisez un fractionnement explicite comme:Pour trier dans l'ordre numérique inverse:
POSIXly (cela fonctionnerait également avec
bash
):Avec les mécanismes internes du shell (sauf pour
printf
certains shells) uniquement (mieux pour les variables avec une valeur courte):Avec
awk
(mieux pour les grandes variables, surtout avecbash
, mais jusqu'à la limite de la taille des arguments (ou d'un seul argument)):la source
Outils logiciels POSIX inélégants monoligne :
la source