Como inverter uma string de dígitos no bash?

6

Qual é a melhor maneira de gerar dígitos em número?

Por exemplo,

$ echo 123 | hook
321
$ echo 12358 | hook
85321 
    
por Anomalous Awe 24.03.2014 / 15:49

6 respostas

12
:~> echo 123456 | rev
654321

Deve funcionar. O uso é bem simples. do homem:

NAME
rev - reverse lines of a file or files

SYNOPSIS
rev [file ...]

DESCRIPTION
The rev utility copies the specified files to the standard output, reversing the order of characters in every line. If no files are specified, the standard input is read.

Se não estiver disponível, você também deve poder usar awk :

:~> echo 123456 | awk '{ for(i=length;i!=0;i--)x=x substr($0,i,1);}END{print x}'
654321

Fonte a escola unix

Se eventualmente precisar inverter completamente um arquivo, você pode adicionar a linha de comando tac to rev da seguinte forma:

tac myfile | rev 
    
por 24.03.2014 / 15:52
6

Para aqueles que não se limitam a bash , com zsh :

forward=123
backward=${(j::)${(Oas::)forward}}

Esses são sinalizadores de expansão de variáveis:

  • s:: : dividido na string vazia, então um elemento por caractere
  • Oa : inverte a matriz resultante ( O para ordem inversa, a para ordem de subscrito de matriz).
  • j:: : junte os elementos com a string vazia.
por 24.03.2014 / 16:17
2

Você está procurando por rev ?

echo 123|rev
321
    
por 24.03.2014 / 15:53
2
#!/bin/bash
#set -xv

string="$1"
reverse_string=""
string_length="${#string}"

while (( "$string_length">=1 )) 
do
     string_length=$(( $string_length - 1 ))
     reverse_string="$reverse_string${string:$string_length:1}"
done

echo "$reverse_string"

torna o arquivo executável

$ chmod +x reverse_string
$ ./reverse_string 123456789    
98765432    
    
por 24.03.2014 / 16:04
2

rev é a óbvia e provavelmente a melhor resposta. Mas rev nem sempre é instalado por padrão. Se você quiser fazer isso puramente com coreutils, você pode usar este comando mais longo:

echo 123 | fold -w1 | tac | paste -d '' -s -
  • fold -w1 coloca cada dígito em uma linha
  • tac é um reverso cat , ou seja, inverte a ordem das linhas
  • paste -d '' -s - em série cola o dígito de cada linha de volta em uma linha
por 24.03.2014 / 19:51
-3
s=""
for i in $*
do
    s="$i $s";
done
for j in $s
do
    echo $j
done
    
por 23.05.2014 / 14:29