2012-05-14 11 views
7

Ho una macchina Linux (Red Hat Linux 5.1), e ho bisogno di aggiungere la seguente attività al mio script Bash.Comando Linux o sintassi Bash che calcola il prossimo carattere ASCII

Quale comando Linux o sintassi Bash calcolerà il prossimo carattere ASCII?

Nota: la sintassi del comando può essere anche AWK/Perl, ma questa sintassi deve essere nel mio script Bash.

Esempio:

input     results 

a --> the next is b 
c --> the next is d 
A --> the next is B 
+0

cosa vuoi che accada se il tuo input è z/Z? – Levon

+0

questo non è logico (ho bisogno fino a z o Z ​​!!!) –

risposta

4

Perl ++ operator gestisce anche le stringhe, in misura:

perl -nle 'print ++$_' 

L'opzione -l con autochomp è necessaria qui, poiché , ad esempio, restituirà altrimenti 1.

+0

soluzione breve e piacevole –

+0

non funziona con alcuni caratteri – user37421

0
perl -le "print chr(ord(<>) + 1)" 

Interactive:

[email protected]:~$ perl -le "print chr(ord(<>) + 1)" 
M 
N 

non interattiva:

[email protected]:~$ echo a | perl -le "print chr(ord(<>) + 1)" 
b 
+0

Questo non si limita ad input o output ASCII. –

8

Usa tradurre (tr):

echo "aA mM yY" | tr "a-yA-Y" "b-zB-Z" 

Esso stampa:

bB nN zZ

+0

uso perfetto per tr. Con bash potresti scrivere 'printf '% s -> il prossimo è% s \ n'" $ input "" $ (tr 'a-yA-Y' 'b-zB-Z' <<< "$ input") "' –

0

Il valore dei caratteri:

c="a" 

Per convertire il carattere al suo valore ASCII:

v=$(printf %d "'$c") 

Il valore che si desidera aggiungere a questo valore ASCII:

add=1 

Per cambia il suo valore ASCII aggiungendo $ aggiungi ad esso:

((v+=add)) 

per convertire il risultato a char:

perl -X -e "printf('The character is %c\n', $v);" 

ho usato -X per disabilitare tutte le avvertenze


È possibile combinare tutti questi in una linea e mettere il risultato nel vairable $ r:

c="a"; add=1; r=$(perl -X -e "printf('%c', $(($add+$(printf %d "'$c"))));") 

è possibile stampare il risultato:

echo "$r" 

È possibile effettuare una funzione per restituire il risultato:

achar() 
{ 
    c="$1"; add=$2 
    printf "$(perl -X -e "printf('%c', $(($add+$(printf %d "'$c"))));")" 
} 

è possibile utilizzare la funzione di:

x=$(achar "a" 1) // x = the character that follows a by 1 

o puoi fare un ciclo:

array=(a k m o) 
for l in "${array[@]}" 
do 
    echo "$l" is followed by $(achar "$l" 1) 
done 
Problemi correlati