2012-05-14 1 views
7

Ich habe eine Linux-Maschine (Red Hat Linux 5.1), und ich muss die folgende Aufgabe zu meinem Bash-Skript hinzufügen.Linux-Befehl oder Bash-Syntax, die das nächste ASCII-Zeichen berechnen

Welcher Linux-Befehl oder Bash-Syntax berechnet das nächste ASCII-Zeichen?

Bemerkung - die Befehlssyntax kann auch AWK/Perl sein, aber diese Syntax muss in meinem Bash-Skript sein.

Beispiel:

input     results 

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

Was möchten Sie tun, wenn Ihre Eingabe z/Z ist? – Levon

+0

das ist kein logischer Fall (ich brauche bis z oder Z !!!) –

Antwort

4

Perl ++ operator auch Zeichenfolgen verarbeitet, in einem Maße:

perl -nle 'print ++$_' 

Die Option -l mit Autochomp ist hier notwendig, da zum Beispiel sonst 1 zurückgibt.

+0

kurze und nette Lösung –

+0

es funktioniert nicht mit einigen Zeichen – user37421

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

Interactive:

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

Nicht interaktiv:

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

Dies beschränkt sich nicht auf ASCII-Eingabe oder -Ausgabe. –

8

Verwendung übersetzen (tr):

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

Er druckt:

bB nN zZ

+0

perfekte Verwendung für tr. Mit bash könnten Sie 'printf '% s schreiben -> next ist% s \ n'" $ input "" $ (tr'a-yA-Y''b-zB-Z '<<< "$ input") "' –

0

Der Zeichenwert:

c="a" 

Um das Zeichen seines ASCII-Wert zu konvertieren:

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

Der Wert, den Sie zu diesem ASCII-Wert hinzufügen mögen:

add=1 

zu Ändern Sie den ASCII-Wert, indem Sie $ add hinzufügen:

((v+=add)) 

Um das Ergebnis zu konvertieren char:

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

I -X verwendet, um alle Warnungen


Sie können alle diese in einer Zeile und das Ergebnis in der vairable kombinieren deaktivieren $ r:

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

können Sie das Ergebnis drucken:

echo "$r" 

Sie eine Funktion machen kann das Ergebnis zurück:

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

oder:

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

Sie die Funktion nutzen können Sie können eine Schleife machen:

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