Zahl drehen in der Shell- wie?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Jerry
Beiträge: 665
Registriert: 01.09.2006 08:36:45
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home

Zahl drehen in der Shell- wie?

Beitrag von Jerry » 16.10.2009 11:26:44

Moin,
Wie kann man eine Zahl innerhalb der Shell drehen?
z.b. hox=82
echo $hox -> 82
gewollt ist aber 28

wie kann die Reihenfolge drehen?

Danke
Wolf
Selbst der längste Weg beginnt mit dem ersten Schritt Lao Tse (~ 600-400 v. Chr.)

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 16.10.2009 11:39:41

Ob Zahl oder String ist irrelevant, in der Shell ist alles ein String.

Nicht portabel, funktioniert aber mit gawk:

Code: Alles auswählen

echo abc | gawk -F '' '{for (i=NF; i>0; i--) {printf $i} }'
EDIT:
Portabel geht's so:

Code: Alles auswählen

echo abc | awk '{for (i=length; i>0; i--) {printf substr($0, i, 1)} }'
Use ed once in a while!

Benutzeravatar
Jerry
Beiträge: 665
Registriert: 01.09.2006 08:36:45
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home

Re: Zahl drehen in der Shell- wie?

Beitrag von Jerry » 16.10.2009 11:55:16

Dank für deine Antwort nur brauche ich eine Lösung die ohne (g)awk oder ähnliches geht, deshlab suche ich ja auch schon seit Stunden ....
Selbst der längste Weg beginnt mit dem ersten Schritt Lao Tse (~ 600-400 v. Chr.)

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Zahl drehen in der Shell- wie?

Beitrag von Spasswolf » 16.10.2009 11:56:39

Code: Alles auswählen

echo 82 | rev
:mrgreen:

Benutzeravatar
Jerry
Beiträge: 665
Registriert: 01.09.2006 08:36:45
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home

Re: Zahl drehen in der Shell- wie?

Beitrag von Jerry » 16.10.2009 12:05:48

-sh: rev: not found :(
Selbst der längste Weg beginnt mit dem ersten Schritt Lao Tse (~ 600-400 v. Chr.)

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Zahl drehen in der Shell- wie?

Beitrag von Spasswolf » 16.10.2009 12:11:31

Ist im Paket Debianutil-linux, das als essentielles Paket eigentlich installiert sein sollte.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Zahl drehen in der Shell- wie?

Beitrag von 123456 » 16.10.2009 12:12:36

Jerry hat geschrieben:-sh: rev: not found :(

Code: Alles auswählen

dpkg -S rev |grep `which rev`
oh, das funktioniert natürlich nicht. 8)
Zuletzt geändert von 123456 am 16.10.2009 12:16:12, insgesamt 1-mal geändert.

Benutzeravatar
Jerry
Beiträge: 665
Registriert: 01.09.2006 08:36:45
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home

Re: Zahl drehen in der Shell- wie?

Beitrag von Jerry » 16.10.2009 12:14:48

Spasswolf hat geschrieben:Ist im Paket Debianutil-linux, das als essentielles Paket eigentlich installiert sein sollte.
Ich hätte dazu schreiben sollen das es sich um einen embedded Controller handelt der noch kein Debian hat ....
Selbst der längste Weg beginnt mit dem ersten Schritt Lao Tse (~ 600-400 v. Chr.)

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Zahl drehen in der Shell- wie?

Beitrag von Spasswolf » 16.10.2009 12:16:20

Ich hab schon befürchtet das jetzt sowas kommt ...

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 16.10.2009 15:38:30

Jerry hat geschrieben:Ich hätte dazu schreiben sollen das es sich um einen embedded Controller handelt der noch kein Debian hat ....
Heißt das, du willst ein C-Programm? Denn wenn du kein awk hast, hast du wohl so gut wie gar nichts.

Hier hast du's in C:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>

#define MAXLINE 1024

int
main()
{
        int i;
        char line[MAXLINE];

        while (fgets(line, MAXLINE, stdin)) {
                for (i = strlen(line)-1; i > 0; i--) {
                        putchar(line[i-1]);
                }
                putchar('\n');
        }

        return 0;
}
Use ed once in a while!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Zahl drehen in der Shell- wie?

Beitrag von GoKi » 16.10.2009 16:50:15

Oder direkt in bash, z.B.

Code: Alles auswählen

#!/bin/bash

in="hello world"
out=""
len=${#in}
while [ $len -gt 0 ]; do
  let len=len-1 
  out=$out"${in:$len:1}"
done
echo $out
Edit: unnötige Variable entfernt
Zuletzt geändert von GoKi am 16.10.2009 22:32:53, insgesamt 1-mal geändert.
MfG GoKi
:wq

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von chrisbra » 16.10.2009 21:05:05

Jerry hat geschrieben:Moin,
Wie kann man eine Zahl innerhalb der Shell drehen?
z.b. hox=82
echo $hox -> 82
gewollt ist aber 28

wie kann die Reihenfolge drehen?

Code: Alles auswählen

chrisbra@t41:~$ echo 82 |perl -lne 'print join("", reverse(split(//)));'
28
Meine Whishlist
:wq!

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Zahl drehen in der Shell- wie?

Beitrag von Spasswolf » 16.10.2009 21:12:53

@GoKi
Das funktioniert aber nur in der bash, wer weiß welche Shell auf dem embedded Device zu finden ist.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Zahl drehen in der Shell- wie?

Beitrag von GoKi » 16.10.2009 22:31:17

Spasswolf hat geschrieben:@GoKi
Das funktioniert aber nur in der bash, wer weiß welche Shell auf dem embedded Device zu finden ist.
Hab ich was anderes behauptet? :)
Mit expr und seq in einer Posix Shell (habe dash benutzt, bzw. ash aus busybox) sollte es so tun...

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
len=`expr length "$in"`
for i in `seq $len -1 1`; do
  out=$out"`expr substr "$in" $i 1`"
done
echo $out
MfG GoKi
:wq

Benutzeravatar
Jerry
Beiträge: 665
Registriert: 01.09.2006 08:36:45
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home

Re: Zahl drehen in der Shell- wie?

Beitrag von Jerry » 17.10.2009 10:17:08

Zuerst mal Danke an alle die geholfen haben. Besonderer Dank an Goki, seine Lösung hat funktioniert.

Gruß
Wolf
Selbst der längste Weg beginnt mit dem ersten Schritt Lao Tse (~ 600-400 v. Chr.)

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 17.10.2009 12:47:43

GoKi hat geschrieben:Mit expr und seq in einer Posix Shell (habe dash benutzt, bzw. ash aus busybox) sollte es so tun...

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
len=`expr length "$in"`
for i in `seq $len -1 1`; do
  out=$out"`expr substr "$in" $i 1`"
done
echo $out
Nette Lösung.

Ich will nicht pedantisch sein, sondern nur anmerken, dass:

- seq von der SUSv3 nicht erwähnt wird. Es ist zwar auf sehr vielen Systemen vorhanden, muss aber nicht. Kann man durch eine Zählvariable in einer while-Schleife ersetzen. Das liest sich dann nicht mehr so schön, erfüllt aber den gleichen Zweck.

- expr laut SUSv3 ``length'' und ``substr'' nicht kennen muss. Siehe:
The use of string arguments length, substr, index, or match produces unspecified results.
Das lässt sich AFAIK leider nicht anders abbilden.


Aber hier hat GoKis Code ja geholfen, somit war er ausreichend gut ... und mehr muss ja nicht sein. :-)
Use ed once in a while!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Zahl drehen in der Shell- wie?

Beitrag von GoKi » 17.10.2009 13:51:41

Meillo hat geschrieben:- seq von der SUSv3 nicht erwähnt wird.
- expr laut SUSv3 ``length'' und ``substr'' nicht kennen muss.
Braucht man aber eigentlich beides nicht, sofern fold vorhanden ist (Was es auf meinem Rechner mit busybox nicht ist). Man kann fold nutzen, um den Eingabestring in einzelne Characters aufzuplitten.

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
IFS='
'
for c in `echo "$in" | fold -w 1`; do
  out="$c""$out"
done
echo $out
Aber das eigentliche Problem scheint ja schon gelöst zu sein. :)
MfG GoKi
:wq

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 17.10.2009 14:24:14

GoKi hat geschrieben:Man kann fold nutzen, um den Eingabestring in einzelne Characters aufzuplitten.

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
IFS='
'
for c in `echo "$in" | fold -w 1`; do
  out="$c""$out"
done
echo $out
Sehr schöne Lösung ... jetzt bin auch ich zufrieden. :-D
Use ed once in a while!

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von chrisbra » 17.10.2009 14:44:25

GoKi hat geschrieben:Man kann fold nutzen, um den Eingabestring in einzelne Characters aufzuplitten.

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
IFS='
'
for c in `echo "$in" | fold -w 1`; do
  out="$c""$out"
done
echo $out
Aber das eigentliche Problem scheint ja schon gelöst zu sein. :)
Nimm sed ;)

Code: Alles auswählen

#!/bin/sh

in="hello world"
out=""
IFS='
'
for c in `echo "$in" | sed -e "s/./&\n/g"`; do
      out="$c""$out"
done
echo $out
Grüße,
Christian
Meine Whishlist
:wq!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Zahl drehen in der Shell- wie?

Beitrag von Duff » 17.10.2009 15:21:16

Schöne Lösung!

Wobei es auch mit der altmodischen Zeile

Code: Alles auswählen

for c in $(echo "$in" | sed -e "s/\(.\)/\1\n/g")
funktioniert.

Wo war nochmal der Unterschied zwischen dem & und dem \1 bei sed?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 17.10.2009 17:43:54

Duff hat geschrieben:Wo war nochmal der Unterschied zwischen dem & und dem \1 bei sed?
& steht für den kompletten Match, \1 für die erste Subexpression. Ich finde & schön, Subexpressions dagegen nutze ich nur wenn nötig.

Altmodisch ist in diesem Zusammenhang irrelevant -- beides ist gleich alt, von ed nämlich.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Zahl drehen in der Shell- wie?

Beitrag von Duff » 17.10.2009 17:55:07

Danke für die Erklärung.

Beim & brauche ich dann keine Klammern \( und \), um das Matching zu speichern.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Zahl drehen in der Shell- wie?

Beitrag von Meillo » 17.10.2009 18:02:01

Duff hat geschrieben:Beim & brauche ich dann keine Klammern \( und \), um das Matching zu speichern.
Korrekt. Es wird einfach der komplette Match eingesetzt.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Zahl drehen in der Shell- wie?

Beitrag von Duff » 17.10.2009 18:09:34

Danke. Muss mir das & mal merken. Benutze nämlich immer die andere Variante.
Oh, yeah!

Antworten