Frage von JamesOffice, 59

UNIX Kommando, dass Daten von der STDIN liest, alle Kleinbuchstaben durch Großbuchstaben ersetzt und auf STDOUT ausgibt?

Hallo, ich kriege grad etwas nicht hin und zwar brauche ich ein UNIX Kommando, dass Daten von der STDIN liest, alle Kleinbuchstaben durch Großbuchstaben ersetzt und auf STDOUT ausgibt? kann mir jemand bitte weierhelfen! Vielen Dank im Voraus!

Antwort
von GWBln, 13

Kurz und schmerzlos:

cat |tr a-zäöü A-ZÄÖÜ

... Ende mit Ctrl C

Das mit den Umlauten habe ich übernommen, wußte es selbst nicht.

Viel kürzer dürfte es wohl nicht gehen!

System: Ubuntu 12.04 LTS ... sollte aber in jeder beliebigen Distribution funktionieren, da die beiden Befehle zu den GNU-Tools gehören.

Antwort
von Linuxhase, 16

Hallo

und zwar brauche ich ein UNIX Kommando, dass Daten von der STDIN liest,
alle Kleinbuchstaben durch Großbuchstaben ersetzt und auf STDOUT
ausgibt?

Welches hättest Du denn gerne?:

echo "AbCdEf" | sed -e 's/\(.*\)/\U\1/'

oder

echo "AbCdEf" | tr '[:lower:]' '[:upper:]'

oder

echo "AbCdEf" | sed 's/.*/\U&/'

oder

echo "AbCdEf" | awk '{print toupper($0)}'

oder

echo "AbCdEf" |perl -pe 'tr/a-z/A-Z/'

Linuxhase

Kommentar von Bernte ,
Kommentar von JamesOffice ,

Respekt von meiner Seite auch und danke :-)
könntest du mir bitte noch kurz sagen wozu die 1 steht bei deinem ersten Kommando! also 

echo "AbCdEf" | sed -e 's/\(.*\)/\U\1/'


Kommentar von ralphdieter ,

\1 bezieht sich auf das erste (hier: einzige) Klammerpaar \( \). Eine typische Anwendung ist das Vertauschen:

echo Abcd | sed 's=\(.\)\(.*\)=\2\1='
bcdA
Kommentar von Linuxhase ,

@JamesOffice

Respekt von meiner Seite auch und danke :-)

Die Aufgabe sowas zu lösen hatte ich für meine Bedürfnisse auch schonmal ;-)

Komplizierter wird es wenn man Unterscheidung zwischen groß- und klein-Schreibung haben möchte, aber die deutsche Sprache Berücksichtigung finden soll.

Linuxhase

Antwort
von ralphdieter, 27
tr a-z A-Z

Geht auch mit Umlauten:

tr a-zäöü A-ZÄÖÜ
Kommentar von JamesOffice ,

Das klingt gut! könnte ich z.B sowas schreiben tr a-z A-Z >&1 ?

Kommentar von ralphdieter ,

Klar, natürlich kannst Du die Standardausgabe auf die Standardausgabe umleiten. Dann wird die Ausgabe nicht mehr standardmäßig auf der Standardausgabe ausgegeben, sondern stattdessen auf die Standardausgabe umgeleitet :-)

> echo "AsDfG asW" | tr a-z A-Z >&1
ASDFG ASW
Expertenantwort
von guenterhalt, Community-Experte für Linux, 28

übersetze dieses Stück Programm mit dem c++ Compiler,
das erzeugte Binary heißt dann a.out ( kann beliebig umbenannt werden)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main ( int argc , char **argv )
{  int ch;
   while ( 1) { ch= getc(stdin);
                if (ch == '\n' ) exit(0);
                ch= toupper(ch);
                fwrite(&ch,1,1,stdout); fflush(stdout);
                  }

}
Kommentar von JamesOffice ,

Danke für die Antwork! Aber ich bräuchte eine UNIX Kommando! Also kein Code! Sowas hier z.B tr a-z A-Z >&1 aber ich bin mir nicht sicher das das stimmt!

Kommentar von guenterhalt ,

Aber ich bräuchte eine UNIX Kommando!

UNIX ist ein eingetragenes Warenzeichen und nach meiner Information gehört UNIX Novell. Welche Kommandozeilenbefehle dann wirklich zu diesem UNIX gehören, wird wohl kaum jemand sagen können, denn selbst bei UNIX haben sich Firmen über viele Jahre vor Gericht gestritten.

Die in Linux verfügbaren Kommandozeilenbefehle sind, auch wenn die Binary-Name identisch mit den UNIX-Binary-Namen identisch sind, Nachbauten, die die vielen Linux-Entwickler (vorzugsweise in C geschrieben)  beigesteuert habe.

Was also hast du an einem Code auszusetzen, der irgendjemand für Linux geschrieben hat und der dann übersetzt auch auf einem "echten" UNIX laufen würde und die gewünschte Aufgabe erfüllt.

Kommentar von ralphdieter ,

Code [...] der dann übersetzt auch auf einem "echten" UNIX laufen würde

> gcc tr.c
> echo -e "Abc\nDef"| ./a.out
ABC
> echo -n "Abc\nDef"| ./a.out

ABC\NDEF

... gefolgt von einer Endlosschleife mit toupper(EOF); EOF ist garantiert negativ, was zu "undefined behavior" führt.

Code, der unter Linux, Solaris, Open UNIX, HP-UX, AIX,
FreeBSD, NetBSD und OpenBSD läuft, sieht so aus:

http://heirloom.cvs.sourceforge.net/viewvc/heirloom/heirloom/tr/tr.c?revision=1....

Kommentar von ralphdieter ,

@guenterhalt: Beim Drüberlesen habe ich beschlossen, an meinem Stil zu arbeiten. Meine Kritik war überhaupt nicht bös gemeint.

Immerhin war der Code vollständig — nach 15 Sekunden hatte ich ein lauffähiges a.out. Und der einzige Bug darin ('\n' statt EOF) ist ja so einfach, dass ich lieber ein kleines Rätsel darum gestrickt habe als mit dem Finger darauf zu zeigen.

Nur: Beim Portieren bin ich schon öfter auf die Schnauze gefallen. Die verschiedenen Compiler und Architekturen können einem selbst bei ANSI-C89 das Leben ganz schön schwer machen. Der verlinkte Sourcecode tr.c illustriert das sehr schön.

Kommentar von ralphdieter ,

tr gab's schon, als Linus noch in den Windeln lag. Schau dir mal die Quellen im Wikipedia-Artikel an:

https://de.wikipedia.org/wiki/Tr_%28Unix%29

Die englische Seite ist sogar noch ergiebiger!

Kommentar von guenterhalt ,

jetzt verstehe ich erst, dass sich hinter der Frage eine Hausaufgabe steckt.
Das mit den Windeln ist schon richtig. Als er sein Studium begonnen hat, habe auch ich schon tr in einem Unix-System benutzt können.
Mit meiner Antwort ( C-Code) wollte ich auch nur zeigen, dass es manchmal einfacher ist, so ein kleines Programm zu schreiben ( ca. 5 Minute) als die Manuals zu lesen und zu verstehen.
Auch muss man beim Selbermachen nicht auf eine App warten und erweitert seinen Horizont.

Kommentar von ralphdieter ,

wollte ich auch nur zeigen, dass es manchmal einfacher ist, so ein kleines Programm zu schreiben ( ca. 5 Minute)

Willkommen im Club der Dinosaurier! Der Nachwuchs in unserer Firma würde hierfür in 5 Stunden etwa 2500 Zeilen Code produzieren (inklusive nichtssagendem Doc-Kommentar vor main). Ob das compiliert und das gewünschte Ergebnis liefert, ist nicht sicher...

Kommentar von guenterhalt ,

das kenne ich sehr genau. Liegt's am Nachwuchs oder doch am Management?
Einige habe eine eigenartige Arbeitsteilung. Auf der einen Seite Programmierer und dann die Tester und Integrationstester (hier meine ich nicht solchen Code, wie ich in meiner Antwort geschrieben habe ).
Die Programmierer müssen Rechenleistung zum Compilieren kaufen (selbst von einer anderen Unit des gleichen  Unternehmens).
Sie kaufen sie nicht, weil zu teuer und Manager werden entsprechend bezahlt. Der Code ist doch fertig abgeliefert. Nicht einmal einfachste Schreibfehler wie // statt /* werden bei einer Inspektion erkannt.

Anschließend sind natürlich die Tester an den vielen Verzögerungen schuld.

@guenterhalt: Beim Drüberlesen habe ich beschlossen, an meinem Stil zu arbeiten. Meine Kritik war überhaupt nicht bös gemeint.

So habe ich das auch nicht verstanden. Es ist doch gut wenn auch hier Kritik geübt wird.
 

Antwort
von slutangel22, 21

Check mal

awk '{print toupper($0)}'
Kommentar von JamesOffice ,

Danke!

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten