Chaîne d'entrée "12345", chaîne de sortie "54321". De préférence sans outils tiers et sans regex.
Réponses
Trop de publicités?Cela inverse la chaîne "en place" :
a=12345
len=${#a}
for ((i=1;i<len;i++)); do a=$a${a: -i*2:1}; done; a=${a:len-1}
echo $a
ou la troisième ligne pourrait être :
for ((i=0;i<len;i++)); do a=${a:i*2:1}$a; done; a=${a:0:len}
ou
for ((i=1;i<len;i++)); do a=${a:0:len-i-1}${a: -i:i+1}${a:len-i-1:1}; done
Pour les personnes sans réviser (recommandé), il y a le simple suivant awk qui divise les champs sur la chaîne nulle (chaque caractère est un champ séparé) et imprime en sens inverse :
awk -F '' '{ for(i=NF; i; i--) printf("%c", $i); print "" }'
Ce qui précède awk est conforme à la norme POSIX. En tant que code conforme awk est garantie sur tous les systèmes d'exploitation compatibles POSIX, la solution ne doit donc pas être considérée comme "tierce partie". Ce code sera probablement plus concis et plus compréhensible qu'un code POSIX pur. sh (ou bash ).
( ; Je ne sais pas si vous considérez la chaîne nulle pour -F une regex... ;)
Quelques méthodes simples pour inverser une chaîne de caractères
echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo
echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo
Convertir en valeurs hexagonales puis inverser
echo '!!!esreveR si sihT' | xxd -p | grep -o .. | tac | xxd -r -p ; echo
echo '!!!esreveR si sihT' | xxd -p | fold -w 2 | tac | xxd -r -p ; echo