[Shell Scripting] Erste zwei Zeichen eines Dateinamens in Variable aufnehmen
Hallo Liste, ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme. Im Gegensatz zu "tail" oder "head", möchte ich aber den Dateinamen und nicht dessen Inhalt abfragen. Meine erste Idee war "test", aber damit fragt man meines Wissens (und des Wissens von "man") ab, ob die Datei überhaupt vorhanden ist. (oder eben nicht) Beim Googlen kam auch nicht wirklich was rum, aber ich glaube, ich stehe einfach mal wieder auf dem Schlauch (ist ja schon recht spät am Tag) Danke und liebe Grüße aus Darmstadt maX Bauer
maX Bauer wrote:
Hallo Liste,
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Probier mal dateiname=hugo echo $dateiname | cut -c1-2 liefert dir ein "hu" zurück. War es das, was du wolltest? mfg oli b. -- Oliver Böhm mailto:boehm@javatux.de http://www.javatux.de
maX Bauer schrieb:
Hallo Liste,
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Im Gegensatz zu "tail" oder "head", möchte ich aber den Dateinamen und nicht dessen Inhalt abfragen. Meine erste Idee war "test", aber damit fragt man meines Wissens (und des Wissens von "man") ab, ob die Datei überhaupt vorhanden ist. (oder eben nicht)
Beim Googlen kam auch nicht wirklich was rum, aber ich glaube, ich stehe einfach mal wieder auf dem Schlauch (ist ja schon recht spät am Tag)
expr substr Dateiname 1 2 -- Gruss Bernd
Hallo, Am Thu, 27 Jan 2005, maX Bauer schrieb:
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Nur mal so als Anregung: $ dateiname="foo bar.txt" $ var="`echo \"$dateiname\" | head -c 2`"; echo "$var" $ var="`echo \"$dateiname\" | cut -b 1-2`"; echo "$var"; $ var="`echo \"$dateiname\" | sed 's/\(..\).*/\1/'`"; echo "$var" $ var="`echo \"$dateiname\" | awk '{print substr($0,0,2);}'`"; echo "$var"; $ var="`echo \"$dateiname\" | awk '{ print gensub(\"^(..).*\",\"\\\1\",0);}'`"; echo "$var"; $ var="`echo \"$dateiname\" | perl -pe 's/(..).*/$1/'`"; echo "$var"; $ var="`echo \"$dateiname\" | perl -ne 'print substr($_,0,2)'`"; echo "$var"; $ var="`echo \"$dateiname\" | dd bs=2 count=1 2>/dev/null`"; echo "$var"; Es gibt sicher noch andere Moeglichkeiten... Vorzuziehen sind die Varianten mit head, cut und dd. -dnh -- Fachsimpelt nen Chirurg mit nem Automechaniker. Sagt der A: "Manchmal fühle ich mich auch wie ein Chirurg." Sagt der C: "Dann versuchensema, bei laufendem Motor die Ventile zu wechseln." -- Reiner Kersten
David Haller, Donnerstag, 27. Januar 2005 21:11:
Nur mal so als Anregung: [...]
Daß Du aber auch immer übertreiben mußt. Man kommt sich da so einfallslos vor. -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
Hallo, Am Thu, 27 Jan 2005, Andreas Feile schrieb:
David Haller, Donnerstag, 27. Januar 2005 21:11:
Nur mal so als Anregung: [...]
Daß Du aber auch immer übertreiben mußt.
Uebertreiben? :)
Man kommt sich da so einfallslos vor.
Und dabei hab ich die Version mit expr ja noch vergessen (da ich expr fast nie verwende): $ dateiname="foo bar.txt"; $ var="`expr substr \"$dateiname\" 1 2`"; echo "$var"; Achso: ich quote NICHT umsonst so "umstaendlich"!!! -dnh -- "Lege die eine Hand in die Gefriertruhe und die andere auf eine heiße Herdplatte. Im Durchschnitt ist das dann ein angenehmes Gefühl." [CB's Lehrer erklaert den "Durchschnitt"]
Am Freitag, 28. Januar 2005 01:54 schrieb David Haller:
Hallo,
Am Thu, 27 Jan 2005, Andreas Feile schrieb:
David Haller, Donnerstag, 27. Januar 2005 21:11:
Nur mal so als Anregung:
[...]
Daß Du aber auch immer übertreiben mußt.
Uebertreiben? :)
Man kommt sich da so einfallslos vor.
Und dabei hab ich die Version mit expr ja noch vergessen (da ich expr fast nie verwende):
$ dateiname="foo bar.txt"; $ var="`expr substr \"$dateiname\" 1 2`"; echo "$var";
Achso: ich quote NICHT umsonst so "umstaendlich"!!!
Weil du es gerade so betonst: Wieso hast du auch den `expr ...`-Ausdruck noch einmal gequotet? Wird nicht das Ergebnis es als _ein_ String zurückgegeben, so dass evtl. White Spaces da nicht stören würden? Ansonsten: ACK. -- Gruß MaxX Hinweis 1: PMs an diese Adresse werden automatisch vernichtet. Hinweis 2: Bitte unbedingt beachten: http://www.suse-etikette.de.vu
Hallo, Am Fri, 28 Jan 2005, Matthias Houdek schrieb:
Am Freitag, 28. Januar 2005 01:54 schrieb David Haller: [..]
$ dateiname="foo bar.txt"; $ var="`expr substr \"$dateiname\" 1 2`"; echo "$var";
Achso: ich quote NICHT umsonst so "umstaendlich"!!!
Weil du es gerade so betonst:
Wieso hast du auch den `expr ...`-Ausdruck noch einmal gequotet? Wird nicht das Ergebnis es als _ein_ String zurückgegeben, so dass evtl. White Spaces da nicht stören würden?
Es gibt auch noch andere Sonderzeichen ;) Es scheint aber, dass das in diesem Fall wirklich nicht noetig ist. Es ist einfach sicherer, wenn man einfach immer quoted, damit einem z.B. das folgende auf die Fuesse faellt: dateiname=".bash*"; echo `expr substr "$dateiname" 1 8`; echo "`expr substr \"$dateiname\" 1 8`"; Also, falls im Ergebnis auch wieder Sonderzeichen drin sind. -dnh -- [Wahlrecht in Appenzell-Innerrhoden] Adrian Suter erzählte die Geschichte, einer Frau aus der Gegend, die die Einführung des Wahlrechts beklagte: "Früher habe ich meinen Männern gesagt, was sie wählen sollen, heute muß ich selbst hinlatschen."
Am Freitag, 28. Januar 2005 20:24 schrieb David Haller:
Hallo,
Am Fri, 28 Jan 2005, Matthias Houdek schrieb:
Am Freitag, 28. Januar 2005 01:54 schrieb David Haller:
[..]
$ dateiname="foo bar.txt"; $ var="`expr substr \"$dateiname\" 1 2`"; echo "$var";
Achso: ich quote NICHT umsonst so "umstaendlich"!!!
Weil du es gerade so betonst:
Wieso hast du auch den `expr ...`-Ausdruck noch einmal gequotet? Wird nicht das Ergebnis es als _ein_ String zurückgegeben, so dass evtl. White Spaces da nicht stören würden?
Es gibt auch noch andere Sonderzeichen ;) Es scheint aber, dass das in diesem Fall wirklich nicht noetig ist. Es ist einfach sicherer, wenn man einfach immer quoted, damit einem z.B. das folgende auf die Fuesse faellt: ^ nicht ;-)
dateiname=".bash*"; echo `expr substr "$dateiname" 1 8`; echo "`expr substr \"$dateiname\" 1 8`";
Also, falls im Ergebnis auch wieder Sonderzeichen drin sind.
ACK. Stimmt, das "*" hat mich auch schon mal gewaltig genervt, weil das irgend so ein "Trottel" in einem Eingabefeld als Smily ":-*" mitgeschickt hat. Manchmal kann man gar nicht doof genug denken. -- Gruß MaxX Hinweis 1: PMs an diese Adresse werden automatisch vernichtet. Hinweis 2: Bitte unbedingt beachten: http://www.suse-etikette.de.vu
Hallo Liste, Am Donnerstag, 27. Januar 2005 19:49 schrieb maX Bauer:
Hallo Liste,
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Im Gegensatz zu "tail" oder "head", möchte ich aber den Dateinamen und nicht dessen Inhalt abfragen. Meine erste Idee war "test", aber damit fragt man meines Wissens (und des Wissens von "man") ab, ob die Datei überhaupt vorhanden ist. (oder eben nicht)
Beim Googlen kam auch nicht wirklich was rum, aber ich glaube, ich stehe einfach mal wieder auf dem Schlauch (ist ja schon recht spät am Tag)
Warum in die Ferne schweifen? Schau in die Manpage zur Bash. Stichwort substitution: HIER=HALLO echo ${HIER:0:3} HAL Was will man mehr? Gruß Wolfgang E.
Hallo, Am Thu, 27 Jan 2005, Wolfgang Erlenkötter schrieb:
Am Donnerstag, 27. Januar 2005 19:49 schrieb maX Bauer:
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Im Gegensatz zu "tail" oder "head", möchte ich aber den Dateinamen und nicht dessen Inhalt abfragen. Meine erste Idee war "test", aber damit fragt man meines Wissens (und des Wissens von "man") ab, ob die Datei überhaupt vorhanden ist. (oder eben nicht)
Beim Googlen kam auch nicht wirklich was rum, aber ich glaube, ich stehe einfach mal wieder auf dem Schlauch (ist ja schon recht spät am Tag)
Warum in die Ferne schweifen? Schau in die Manpage zur Bash. Stichwort substitution:
HIER=HALLO echo ${HIER:0:3} HAL
Was will man mehr?
*ARGH* $ zgrep ':.:' `man -w bash` A sample value is ``.:~:/usr''. Kein Wunder, dass ich auf diese Version nicht gekommen bin. Das ist dann natuerlich die schnellste (da bash-interne) Version: dateiname="foo bar.txt"; var="${dateiname:0:2}"; echo "$var" Aber, im Gegensatz zu den von mir aufgezaehlten Varianten ist obige nicht unbedingt portabel (nachschauen / ausprobieren), auch die mit expr ist u.U. nicht portabel. Die Loesungen mit cut, dd, sed, awk und perl sind aber portabel (aber langsamer, und die mit perl sind eh nur akademischen Interesses, denn in einem shell-script perl aufzurufen ist kontraproduktiv, wenn man schon perl braucht braucht sollte/kann man gleich alles in perl implementieren (und ggfs. von perl aus anderes aufrufen). ;) -dnh -- The correct answer is a grunt, followed by ripping the offender open. HTH. -- Shalon Wood
David Haller wrote:
Hallo,
Am Thu, 27 Jan 2005, Wolfgang Erlenkötter schrieb:
Am Donnerstag, 27. Januar 2005 19:49 schrieb maX Bauer:
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme.
Im Gegensatz zu "tail" oder "head", möchte ich aber den Dateinamen und nicht dessen Inhalt abfragen. Meine erste Idee war "test", aber damit fragt man meines Wissens (und des Wissens von "man") ab, ob die Datei überhaupt vorhanden ist. (oder eben nicht)
Beim Googlen kam auch nicht wirklich was rum, aber ich glaube, ich stehe einfach mal wieder auf dem Schlauch (ist ja schon recht spät am Tag)
Warum in die Ferne schweifen? Schau in die Manpage zur Bash. Stichwort substitution:
HIER=HALLO echo ${HIER:0:3} HAL
Was will man mehr?
*ARGH*
$ zgrep ':.:' `man -w bash` A sample value is ``.:~:/usr''.
Kein Wunder, dass ich auf diese Version nicht gekommen bin.
Das ist dann natuerlich die schnellste (da bash-interne) Version:
dateiname="foo bar.txt"; var="${dateiname:0:2}"; echo "$var"
Aber, im Gegensatz zu den von mir aufgezaehlten Varianten ist obige nicht unbedingt portabel (nachschauen / ausprobieren), auch die mit expr ist u.U. nicht portabel.
Die Loesungen mit cut, dd, sed, awk und perl sind aber portabel (aber langsamer, und die mit perl sind eh nur akademischen Interesses, denn in einem shell-script perl aufzurufen ist kontraproduktiv, wenn man schon perl braucht braucht sollte/kann man gleich alles in perl implementieren (und ggfs. von perl aus anderes aufrufen). ;)
-dnh
Ihr habt sie ja nicht mehr alle !! Zum Ersten, zum Zweiten und zum Dritten, wer bietet mehr ? Schön aber, dass ich so viele Auswahlmöglichkeiten habe. Ich werd' sie alle mal ausprobieren. Dass ich zwar so etwas nicht ergööglen konnte ist echt arm (tja, so bin ich), aber jetzt habe ich echt alle Wege offen. D.A.N.K.E !! Schönen Abend noch Gru0 maX Bauer
Hallo, Am Fri, 28 Jan 2005, maX Bauer schrieb:
David Haller wrote:
Am Thu, 27 Jan 2005, Wolfgang Erlenkötter schrieb:
Am Donnerstag, 27. Januar 2005 19:49 schrieb maX Bauer:
ich suche ein (bzw. DAS) Programm (ich weiss, dass es da eines gibt) ähnl. "tail", mit dem ich einen gegebenen Dateinamen auf die ersten zwei Zeichen kürze, und diese dann in eine Variable übernehme. [..] Warum in die Ferne schweifen? Schau in die Manpage zur Bash. Stichwort substitution:
HIER=HALLO echo ${HIER:0:3} HAL
Was will man mehr?
*ARGH*
$ zgrep ':.:' `man -w bash` A sample value is ``.:~:/usr''.
Kein Wunder, dass ich auf diese Version nicht gekommen bin. [..] Ihr habt sie ja nicht mehr alle !! Zum Ersten, zum Zweiten und zum Dritten, wer bietet mehr ? Schön aber, dass ich so viele Auswahlmöglichkeiten habe. Ich werd' sie alle mal ausprobieren.
*g* Schau dir dann meine Mails an, ich hab alle Varianten ja schoen in vergleichbarer Form aufgefuehrt, auch die, die mir nicht einfielen ;) Am mit Abstand am schnellsten ist natuerlich die shell-interne Variante ${var:n:m}, die aber wohl nur POSIX-shell (aber nicht bourne-shell) kompatibel ist. D.h. es laeuft nur in einer hinreichend neuen bash, ksh etc. aber z.B. nicht in einer ash, sh... Gefolgt wohl von der 'expr' Variante (evtl. auch spezifisch; ob alle exprs das mit 'substr' koennen?). Dann die cut, head, dd, awk und sed Varianten, die sich wenig unterscheiden duerften und die sollten auch alle portabel sein. Die perl-Varianten sind dann mit Abstand die langsamsten, aber dafuer auch portabel. Und vielleicht will man ja eh noch perl verwenden, ohne Zusammenhang bzw. im shell-script sind diese natuerlich nur rein aus akademischen Interesse aufgefuehrt ;)
Dass ich zwar so etwas nicht ergööglen konnte ist echt arm (tja, so bin ich), aber jetzt habe ich echt alle Wege offen.
Nach sowas laesst sich generell schwer suchen. Da kannst du machen was du willst. Da hilft eher Erfahrung. Mit der shell und den unix-tools. Hm. Irgendwann hatte ich IIRC hier mal ne Zusammenfassung gemailt, wofuer sed, awk, perl usw. "passen"... Generell hilfreich ist es, wenn man sich die Frage mal auf englisch stellt (da hilft u.U. sogar babelfish). Siehe !Zufalls-Sig ("concat" == verkuerzte Version von "concatenate")... Bei der Silbe "cat" ging dem Freund dann ein Licht auf ;) So wie in deinem Fall evtl. das Verb "cut" oder das Substantiv "head" zur Erleuchtung haette fuehren koennen. Welches Tool dann richtig[tm] ist muss man ausprobieren oder nachfragen ;) Bzw. man kann nachschauen, ob sich das in der shell (s.o.) oder z.B. mit "Allzwecktools" wie expr oder awk und perl erledigen laesst ;) Das nur so als kleine Hilfestellung, wie du evtl. selber auf sowas kommen kannst. Ansonsten sind solche Fragen absolut normal, jeder, auch und gerade ich (s.o. bzw. die expr-Variante) steht mal auf dem Schlauch. :) -dnh -- Excerpt from a conversation with a friend, early in my unix odyssey: "So now I've got all these floppy-sized archive pieces, and I haven't been able to figure out what program I'm supposed to use to concat-- er, never mind." [void]
participants (7)
-
Andreas Feile
-
David Haller
-
Illuminatus@t-online.de
-
Matthias Houdek
-
maX Bauer
-
Oli B.
-
Wolfgang Erlenkötter