Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Variablen "zerteilen"

2 views
Skip to first unread message

Rolf Buenning

unread,
Mar 8, 2023, 10:39:53 AM3/8/23
to
Hallo,

Ich habe mir schon einen Wolf gesucht, aber nichts gefunen.
Ich weiss, dass das geht, schon öfter gelesen, aber...

Eine Variable enthÀlt "39/2023".
Nun möchte ich erhalten "39" und "2023" in zwei anderen Variablen.
Wie geht das?

Danke fĂŒr Hilfe
Rolf

Andreas Neumann

unread,
Mar 8, 2023, 11:03:32 AM3/8/23
to
Rolf Buenning wrote:

> Eine Variable enthÀlt "39/2023".
> Nun möchte ich erhalten "39" und "2023" in zwei anderen Variablen.
> Wie geht das?

Z.B. per cut -d'/' -f1

man cut erklÀrt die Parameter.

Michael SchĂŒtz

unread,
Mar 8, 2023, 11:05:04 AM3/8/23
to
Rolf Buenning <r.bue...@gmx.de> schrieb:
Es gibt bestimmt viele Möglichkeiten. Mit meinen beschrÀnkten
Kenntnissen im Skripting geht z.B. das:

V1=`echo "39/2023"|awk -F/ '{ print $1 }'`

Analog fĂŒr den zweiten Teil.

> Danke fĂŒr Hilfe
> Rolf

Bitte,
Schultze

--
Vielleicht sollte man die Todesstrafe wieder einfĂŒhren; fĂŒr Leute, die
sie vorschlagen! Wolfgang Neuss

Markus Schaaf

unread,
Mar 8, 2023, 11:27:47 AM3/8/23
to
Am 08.03.23 um 16:39 schrieb Rolf Buenning:
v=39/2023
echo ${v%/*} ${v#*/}

Rolf Buenning

unread,
Mar 8, 2023, 11:28:13 AM3/8/23
to
Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> writes:
>>Eine Variable enthÀlt "39/2023".
>
> Hier unter bash:
>
> $ v=39/2023; IFS=/ read -r v1 v2 <<< $v; echo $v, $v1, $v2
> 39/2023, 39, 2023

Danke, sowas habe ich gesucht, fĂŒr die bash.
Dank auch den anderen Postern, mit awk und cut habe ich auch schon
experimentiert.
Mit awk hatte es auch schon geklappt.

Ich dachte an sowas ${var1%.*} oder so Àhnlich.
Aber das obige ist gut.

Rolf

Stefan Wiens

unread,
Mar 8, 2023, 11:38:00 AM3/8/23
to
Rolf Buenning <r.bue...@gmx.de> writes:

> Eine Variable enthÀlt "39/2023".
> Nun möchte ich erhalten "39" und "2023" in zwei anderen Variablen.
> Wie geht das?

Ein Ansatz:

$ echo "39/2023" | ( IFS=/ read var1 var2 ; echo $var1 - $var2 )
39 - 2023


--
Stefan

Ulli Horlacher

unread,
Mar 8, 2023, 11:53:54 AM3/8/23
to
Urs Janßen <u...@niko.tin.org> wrote:
> Rolf Buenning wrote:
>> Ich dachte an sowas ${var1%.*} oder so Àhnlich.
>
> A="39/2023" ; B=${A/%\/*/} ; C=${A/#*\//} ; echo -e $B"\n"$C
> 39
> 2023

Mogeln mit bash! :-)

Spaetestens hier sollte um die Verwendung einer vernuenftigen
Skriptsprache nachgedacht werden.

--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum TIK
Universitaet Stuttgart E-Mail: horl...@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: https://www.tik.uni-stuttgart.de/

Ulli Horlacher

unread,
Mar 8, 2023, 11:56:14 AM3/8/23
to
Damit kann man sich schnell in den Fuss schiessen.

Probiers mal so:

echo "39/2023" | ( IFS=/ read var1 var2 )
echo $var1 - $var2

Klar, was passiert?

Stefan Wiens

unread,
Mar 8, 2023, 12:04:10 PM3/8/23
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> writes:

> Stefan Wiens <s....@gmx.net> wrote:
>> Rolf Buenning <r.bue...@gmx.de> writes:
>>
>>> Eine Variable enthÀlt "39/2023".
>>> Nun möchte ich erhalten "39" und "2023" in zwei anderen Variablen.
>>> Wie geht das?
>>
>> Ein Ansatz:
>>
>> $ echo "39/2023" | ( IFS=/ read var1 var2 ; echo $var1 - $var2 )
>> 39 - 2023
>
> Damit kann man sich schnell in den Fuss schiessen.
>
> Probiers mal so:
>
> echo "39/2023" | ( IFS=/ read var1 var2 )
> echo $var1 - $var2
>
> Klar, was passiert?

Dass die Zuweisung nur in der Subshell wirkt, sollten
die Klammern ausdrĂŒcken.

Man kann sich auch in den Fuß schießen, wenn die
Zuweisung unbeabsichtigt auch in der aufrufenden Shell wirkt.

--
Stefan

Stefan Wiens

unread,
Mar 8, 2023, 12:09:16 PM3/8/23
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> writes:

> Urs Janßen <u...@niko.tin.org> wrote:
>> Rolf Buenning wrote:
>>> Ich dachte an sowas ${var1%.*} oder so Àhnlich.
>>
>> A="39/2023" ; B=${A/%\/*/} ; C=${A/#*\//} ; echo -e $B"\n"$C
>> 39
>> 2023
>
> Mogeln mit bash! :-)
>
> Spaetestens hier sollte um die Verwendung einer vernuenftigen
> Skriptsprache nachgedacht werden.

Zumindest in Situationen, wo es auf Shell-KompatibilitÀt
ankommt sollte man ohne Not nicht solch intransparente
Skripte einsetzen.

--
Stefan

Rolf Buenning

unread,
Mar 8, 2023, 1:07:36 PM3/8/23
to
Urs Janßen <u...@niko.tin.org> schrieb:
> Rolf Buenning wrote:
>> Ich dachte an sowas ${var1%.*} oder so Àhnlich.
>
> A="39/2023" ; B=${A/%\/*/} ; C=${A/#*\//} ; echo -e $B"\n"$C
> 39
> 2023

Ha!

Stefan Reuther

unread,
Mar 8, 2023, 2:14:25 PM3/8/23
to
Am 08.03.2023 um 16:39 schrieb Rolf Buenning:
> Eine Variable enthÀlt "39/2023".
> Nun möchte ich erhalten "39" und "2023" in zwei anderen Variablen.
> Wie geht das?

v=39/2039
v1=${v%/*} v2=${v##*/}
echo "$v1, $v2"

Diese Variante hat gegenĂŒber den Lösungen mit awk, sed, cut, IFS usw.
den Vorteil, keine externen Prozesse und kein wackliges "parse mal die
Ausgabe" zu benötigen.

Wichtig ist auch, sich dafĂŒr zu entscheiden, ob beim ersten oder beim
letzten SchrÀgstrich geschnitten werden soll, falls es mehrere gibt.
Diese Lösung schneidet am letzten. Alternativ schneidet

v1=${v%%/*} v2=${v#*/}

am ersten. Bei

v=1/2/3/4
v1=${v%/*} v2=${v#*/}

hingegen taucht der Mittelteil 2/3 in beiden HĂ€lften auf.


Stefan

Helmut Waitzmann

unread,
Mar 8, 2023, 2:15:03 PM3/8/23
to
r...@zedat.fu-berlin.de (Stefan Ram):
> r...@zedat.fu-berlin.de (Stefan Ram) writes:
>>Hier unter bash:
>>$ v=39/2023; IFS=/ read -r v1 v2 <<< $v; echo $v, $v1, $v2
>>39/2023, 39, 2023
>>.
>
> Auch bash:
>
> $ v=39/2023; v1=${v%/*}; v2=${v#*/}; echo $v, $v1, $v2
> 39/2023, 39, 2023

Das ist nicht nur zum Bash sondern auch zum POSIX‐Shell
kompatibel und löst deshalb die gestellte Aufgabe (in der Bash
keine Voraussetzung war) vollstÀndig, völlig ohne Bashismen oder
externe Programme.  Es lĂ€sst sich beispielsweise in Init‐Skripten
einsetzen, wo möglicherweise noch nicht alle installierten
Skript‐Interpreter zur VerfĂŒgung stehen.

Wenn man es leicht abÀndert, kann man einen Variableninhalt auch
in mehr als zwei Teile zerlegen:

v='39/2023/08/15' &&
v1="$v" &&
v2="${v1#*/}" &&
v3="${v2#*/}" &&
v4="${v3#*/}" &&
v1="${v1%%/*}" &&
v2="${v2%%/*}" &&
v3="${v3%%/*}"

Helmut Waitzmann

unread,
Mar 8, 2023, 2:42:58 PM3/8/23
to
Stefan Reuther <stefa...@arcor.de>:
> Am 08.03.2023 um 16:39 schrieb Rolf Buenning:
>> Eine Variable enthÀlt "39/2023".
>>
>> Nun möchte ich erhalten "39" und "2023" in zwei anderen
>> Variablen.
>> Wie geht das?
>>
>
> v=39/2039
> v1=${v%/*} v2=${v##*/}
> echo "$v1, $v2"
>
> Diese Variante hat gegenĂŒber den Lösungen mit awk, sed, cut, IFS
> usw. den Vorteil, keine externen Prozesse und kein wackliges
> "parse mal die Ausgabe" zu benötigen.

Was meinst du mit wackligem Ausgabe‐Parsen?  Die folgende
Kommandozeile zerlegt mit Hilfe der Variablen «IFS» den Inhalt
der Variablen «v» in die positional parameters ("$@").

saved_IFS="${IFS-}" && ${IFS+:} unset -- saved_IFS &&
{
IFS=/ && set -- $v &&
IFS="${saved_IFS-}" && ${saved_IFS+:} unset -- IFS
}

Ich kann daran nichts Wackliges erkennen.

Rolf Buenning

unread,
Mar 9, 2023, 10:36:25 AM3/9/23
to
Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
> r...@zedat.fu-berlin.de (Stefan Ram) writes:
>>Hier unter bash:
>>$ v=39/2023; IFS=/ read -r v1 v2 <<< $v; echo $v, $v1, $v2
>>39/2023, 39, 2023
>>.
>
> Auch bash:
>
> $ v=39/2023; v1=${v%/*}; v2=${v#*/}; echo $v, $v1, $v2
> 39/2023, 39, 2023
>

Und warum nicht sowas(nach grĂŒndlichem Nachdenken (: Grmpf fiel mir man bash
ein)

${parameter:offset:length}
Substring Expansion. Expands to up to length characters of the value of parameter
starting at the character specified by offset. If parameter is @, an indexed array
subscripted by @ or *, or an associative array name, the results differ as de‐
scribed below. If length is omitted, expands to the substring of the value of pa‐
rameter starting at the character specified by offset and extending to the end of
the value. length and offset are arithmetic expressions (see ARITHMETIC EVALUATION
below).

Hab's ausprobiert, funktioniert.

Rolf

Rolf Buenning

unread,
Mar 9, 2023, 11:24:43 AM3/9/23
to
Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> writes:
>>Und warum nicht sowas(nach grĂŒndlichem Nachdenken (: Grmpf fiel mir man bash
>>ein)
>>${parameter:offset:length}
>
> Dies ist geeignet, wenn sich die Stelle, an welcher zerlegt
> werden soll, an einer bekannten konstanten Position befindet.
>

Ja, stimmt, funktioniert bei mir nur, weil die Positionen bekannt sind.

Mal zur ErklÀrung, warum ich das mache (hab ja sonst nicht viel zu tun):

Ich bekomme meine KontoauszĂŒge elektronisch als pdf.
Normalerweise heißen die Auszug$Jahr_0000$Nummer.pdf.
Aus unerfindlichen GrĂŒnden werden hĂ€ufig welche geliefert,
die einfach Auszug.pdf heißen.
Die Beeiligten (Bank sowie Software-Hersteller streiten jegliche
Beteiligung an diesem Fehler ab.

Ich speichere die dann irgendo ab und muss sie umbenennen.
Dazu hab ich mir ein Bash-Script geschrieben.
Es ist (mir) leichter, das Script aufzurufen als
Cursor auf das File, rechtsclick, umbenennen, Eingabe Enter.
WIEGE ): sagt, hab ja sonst nichts zu tun (als Rentner)

Rolf

Thomas Dorner

unread,
Mar 9, 2023, 12:38:03 PM3/9/23
to
Das ist Poxix und mitnichten BaSH!

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

${parameter%[word]}
${parameter%%[word]}
${parameter#[word]}
${parameter##[word]}


Ein "${parameter/substitute/with}" wÀre ein Bashism.

Viele GrĂŒĂŸe, Thomas
--
Adresse gilt nur kurzzeitig!

Christian Garbs

unread,
Mar 9, 2023, 12:43:51 PM3/9/23
to
Mahlzeit!

Rolf Buenning <r.bue...@gmx.de> wrote:
> Stefan Ram <r...@zedat.fu-berlin.de> schrieb:

>> $ v=39/2023; v1=${v%/*}; v2=${v#*/}; echo $v, $v1, $v2
>> 39/2023, 39, 2023

> Und warum nicht sowas(nach grĂŒndlichem Nachdenken (: Grmpf fiel mir man bash
> ein)
>
> ${parameter:offset:length}

Du hast Recht - in der Aufgabenstellung steht nichts von "ich möchte
am SchrÀgstrich teilen", sondern nur "ich möchte das und das haben".

Im Sinne defensiver Programmierung in einem unbekannten Umfeld haban
die Antwortenden das instinktiv aufgefasst als "da nehmen wir mal den
SchrÀgstrich als Trenner, falls eine der Zahlen eine Stelle mehr oder
weniger bekommt".

Wenn sichergestellt ist, dass das nie passiert, passt die Lösung mit
"Zeichen einzeln abzÀhlen" auch.

Gruß
Christian

PS: Falls sich morgen das Trennzeichen von / zu : Àndert, gehen alle
anderen Lösungen kaputt und nur ${parameter:offset:length} bleibt
heile ;-) Ist halt unterspezifiziert in der Aufgabe, daher
verschiedene Varianten.

--
....Christian.Garbs....................................https://www.cgarbs.de
Todays Experiment.... FAILED.

Ulli Horlacher

unread,
Mar 9, 2023, 1:21:33 PM3/9/23
to
Rolf Buenning <r.bue...@gmx.de> wrote:

> Ich bekomme meine KontoauszĂŒge elektronisch als pdf.
> Normalerweise heißen die Auszug$Jahr_0000$Nummer.pdf.
> Aus unerfindlichen GrĂŒnden werden hĂ€ufig welche geliefert,
> die einfach Auszug.pdf heißen.
>
> Ich speichere die dann irgendo ab und muss sie umbenennen.
> Dazu hab ich mir ein Bash-Script geschrieben.

bash ist nicht gut geeignet zur Stringverarbeitung.
Da wuerde ich besser Perl nehmen. Hipper soll Python sein :-)

Aber woher bekommst du die Umbenennungsparameter Jahr,Nummer wenn die
Datei nur "Auszug.pdf" heisst?

Stefan Wiens

unread,
Mar 9, 2023, 3:19:02 PM3/9/23
to
OK, nicht schön aber in Ordnung.


--
Stefan

Rolf Buenning

unread,
Mar 10, 2023, 12:19:23 AM3/10/23
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> wrote:
>
>> Ich bekomme meine KontoauszĂŒge elektronisch als pdf.
>>
>> Ich speichere die dann irgendo ab und muss sie umbenennen.
>> Dazu hab ich mir ein Bash-Script geschrieben.
>
> bash ist nicht gut geeignet zur Stringverarbeitung.
> Da wuerde ich besser Perl nehmen. Hipper soll Python sein :-)

Möglich, aber von Perl habe ich null Ahnung.
Python habe ich angefangen zu lernen, aber das dauert...
>
> Aber woher bekommst du die Umbenennungsparameter Jahr,Nummer wenn die
> Datei nur "Auszug.pdf" heisst?

Die steht im PDF, ich extrahiere sie mit strings und grep und awk.

Rolf

Ulli Horlacher

unread,
Mar 10, 2023, 2:11:21 AM3/10/23
to
Rolf Buenning <r.bue...@gmx.de> wrote:

>> bash ist nicht gut geeignet zur Stringverarbeitung.
>> Da wuerde ich besser Perl nehmen. Hipper soll Python sein :-)
>
> Möglich, aber von Perl habe ich null Ahnung.

Das hattest du auch mal von bash :-)


>> Aber woher bekommst du die Umbenennungsparameter Jahr,Nummer wenn die
>> Datei nur "Auszug.pdf" heisst?
>
> Die steht im PDF, ich extrahiere sie mit strings und grep und awk.

AHA! Na also!
Perl hat angefangen als Obermenge aus grep und awk!
Wenn man das etwas kann, ist den Einstieg in Perl trivial.
Du kannst strings, grep, awk und bash einfach durch Perl ersetzen.

Und die Leute in de.comp.lang.perl sind echt nett hilfsbereit.

Hattest du nicht geschrieben, du waerst Rentner mit viel Zeit? :-)

Rolf Buenning

unread,
Mar 10, 2023, 3:51:59 AM3/10/23
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> wrote:
>
>>> Da wuerde ich besser Perl nehmen. Hipper soll Python sein :-)
>> Möglich, aber von Perl habe ich null Ahnung.
> Das hattest du auch mal von bash :-)

>>> Aber woher bekommst du die Umbenennungsparameter Jahr,Nummer wenn die
>>> Datei nur "Auszug.pdf" heisst?
>>
>> Die steht im PDF, ich extrahiere sie mit strings und grep und awk.
>
> Du kannst strings, grep, awk und bash einfach durch Perl ersetzen.
>
> Und die Leute in de.comp.lang.perl sind echt nett hilfsbereit.

Ok, notiert.
>
> Hattest du nicht geschrieben, du waerst Rentner mit viel Zeit? :-)

Ja, hatte ich, werde im Mai 85.

Rolf

Ulli Horlacher

unread,
Mar 10, 2023, 4:37:23 AM3/10/23
to
Rolf Buenning <r.bue...@gmx.de> wrote:

>> Hattest du nicht geschrieben, du waerst Rentner mit viel Zeit? :-)
>
> Ja, hatte ich, werde im Mai 85.

Dann haettest du mit UNIX von Anfang an dabei gewesen sein koennen?!
Perl gibts ja erst seit 1987.

Stefan Reuther

unread,
Mar 10, 2023, 10:50:32 AM3/10/23
to
Am 08.03.2023 um 20:38 schrieb Helmut Waitzmann:
> Stefan Reuther <stefa...@arcor.de>:
>> Diese Variante hat gegenĂŒber den Lösungen mit awk, sed, cut, IFS usw.
>> den Vorteil, keine externen Prozesse und kein wackliges "parse mal die
>> Ausgabe" zu benötigen.
>
> Was meinst du mit wackligem Ausgabe‐Parsen?  Die folgende Kommandozeile
> zerlegt mit Hilfe der Variablen «IFS» den Inhalt der Variablen «v» in
> die positional parameters ("$@").
>
>   saved_IFS="${IFS-}" && ${IFS+:} unset -- saved_IFS &&
>   {
>     IFS=/ && set -- $v &&
>     IFS="${saved_IFS-}" && ${saved_IFS+:} unset -- IFS
>   }
>
> Ich kann daran nichts Wackliges erkennen.

Wacklig ist, dass das ganz schön viele Schritte sind, die man vergessen
oder fehlerhaft ausfĂŒhren kann.

Ich mach seit 25+ Jahren Linux, und mir ist erst vor wenigen Wochen
bewusst geworden, dass es Stellen gibt, wo tatsÀchlich zwischen den
ZustÀnden "nicht gesetzt" und "leer" von Umgebungsvariablen
unterschieden wird, und ausnahmslos jeder der Kollegen, die ich darauf
ansprach, war davon ebenfalls ĂŒberrascht. Klar, steht in der manpage, da
liest man aber eben drĂŒber. Insofern wird dir kaum einer *aus dem Kopf*
den Boilerplate mit `${IFS+:} unset` bauen.


Stefan

Markus Schaaf

unread,
Mar 10, 2023, 1:31:27 PM3/10/23
to
Am 10.03.23 um 16:37 schrieb Stefan Reuther:
> Am 08.03.2023 um 20:38 schrieb Helmut Waitzmann:
>>   saved_IFS="${IFS-}" && ${IFS+:} unset -- saved_IFS &&
>>   {
>>     IFS=/ && set -- $v &&
>>     IFS="${saved_IFS-}" && ${saved_IFS+:} unset -- IFS
>>   }
>>
>> Ich kann daran nichts Wackliges erkennen.
> Wacklig ist, dass das ganz schön viele Schritte sind, die man vergessen
> oder fehlerhaft ausfĂŒhren kann.

Haha. Vor vielen Jahren habe ich mal eine Anleitung der Art
"Erste Schritte mit Bash" gelesen. Was mir in Erinnerung
geblieben ist, war eine Stelle Àhnlich wie: "Du könntest auch IFS
verÀndern, um Folgendes zu erreichen, aber mach das nicht." (Der
Grund ist, dass IFS an etlichen, gar nicht so offensichtlichen
Stellen benutzt wird.

> Ich mach seit 25+ Jahren Linux, und mir ist erst vor wenigen Wochen
> bewusst geworden, dass es Stellen gibt, wo tatsÀchlich zwischen den
> ZustÀnden "nicht gesetzt" und "leer" von Umgebungsvariablen
> unterschieden wird

Ich mach gerade was mit Lua: In Lua gibt es zwei Funktionen, um
aus C Strings nach Lua zu importieren. Die eine `lua_pushstring(
lua_State *, char const * s )` pusht bei `s == NULL` den Wert
`nil`. Die andere `lua_pushlstring( lua_State *, char const *s,
size_t s_len )` pusht bei `s == NULL` den Wert `""`.

MfG

Rolf Buenning

unread,
Mar 11, 2023, 2:08:39 AM3/11/23
to
Andreas Kohlbach <a...@spamfence.net> schrieb:
> On 10 Mar 2023 05:19:21 GMT, Rolf Buenning wrote:
>>
>> Python habe ich angefangen zu lernen, aber das dauert...
>
> Welche Quelle, welches Buch liest Du dazu?

Hallo Andreas,

Python 3
Johannes Ernstl, Peter Kaiser
Rheinwerk

Marcel Logen

unread,
Mar 11, 2023, 10:14:56 AM3/11/23
to
Rolf Buenning in de.comp.os.unix.shell:

>Andreas Kohlbach <a...@spamfence.net> schrieb:
>> On 10 Mar 2023 05:19:21 GMT, Rolf Buenning wrote:

>>> Python habe ich angefangen zu lernen, aber das dauert...
>>
>> Welche Quelle, welches Buch liest Du dazu?

>Python 3
>Johannes Ernstl, Peter Kaiser
>Rheinwerk

Die offizielle Online-Doku von der Website ist IMHO auch ganz gut.

<https://docs.python.org/3/>

Ich schaue da immer rein, wenn ich mir Python3-Scripts erstelle.

Marcel 1v4o0 (2069248)
--
╭─╼ ╭─╼ ╭───╼ ╭─────────
╭─╼ ╭─╯ ╰────╯ ╰─╯ │ │
╭───╼ ╭─╼ ╭─╼ ╭────╯ ╰──╯ ╭─────╯ ╭─╯
╭─╯ ╰────────────────╯ ╰─╯ ╰─╯ ╰───────╯ d6699c

Rolf Buenning

unread,
Mar 11, 2023, 12:34:41 PM3/11/23
to
Marcel Logen <33320000...@ybtra.de> schrieb:
>
> Die offizielle Online-Doku von der Website ist IMHO auch ganz gut.
>
><https://docs.python.org/3/>
>
> Ich schaue da immer rein, wenn ich mir Python3-Scripts erstelle.

Danke, habe ich mir gespeichert.

Rolf

Helmut Waitzmann

unread,
Mar 11, 2023, 2:19:40 PM3/11/23
to
Stefan Reuther <stefa...@arcor.de>:

> Ich mach seit 25+ Jahren Linux, und mir ist erst vor wenigen
> Wochen bewusst geworden, dass es Stellen gibt, wo tatsÀchlich
> zwischen den ZustÀnden "nicht gesetzt" und "leer" von
> Umgebungsvariablen unterschieden wird

Ein (Extrem‐) Beispiel ist die Umgebungsvariable
«POSIXLY_CORRECT», die von GNU‐Programmen beachtet wird. 
Entscheidend ist bei ihr nicht, welchen Inhalt sie hat, sondern
nur, ob es sie gibt.

Beispiel:

: > -Dateiname

ls -ld . -Dateiname

POSIXLY_CORRECT= ls -ld . -Dateiname

Dieses Beispiel zeigt gleichzeitig, dass man die FĂ€higkeiten von
GNU‐Programmen, bei nichtvorhandener Umgebungsvariabler
«POSIXLY_CORRECT» Optionen nach anderen Parametern
(beispielsweise Dateinamen) angeben zu können, nicht nutzen,
sondern erst die Optionen, dann den Optionenendeanzeiger «--» und
dann die restlichen Parameter angeben sollte.  Geht man so vor,
kommt es in Bezug auf die Optionenverarbeitung auf die An‐ oder
Abwesenheit der Umgebungsvariablen «POSIXLY_CORRECT» nicht mehr
an:

ls -ld -- . -Dateiname

POSIXLY_CORRECT= ls -ld -- . -Dateiname

Rolf Buenning

unread,
Mar 12, 2023, 4:46:23 AM3/12/23
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> wrote:
>
>>> bash ist nicht gut geeignet zur Stringverarbeitung.
>
>>> Aber woher bekommst du die Umbenennungsparameter Jahr,Nummer wenn die
>>> Datei nur "Auszug.pdf" heisst?

Hallo, ich wieder!
Nachdem meine Script nach etlichen Überarbeitungen nun "fertig" ist,
möchte ich es euch mal zeigen.

#v+

#!/bin/bash
# Umbenennung eines falsch bezeichneten Kontoauszugs

Name=Auszug.pdf
NullStr=""

A=$(grep --text Kontoauszug Auszug.pdf | awk '{print $3}')
# A enthÀlt jetztdie Auszugnummer und das Jahr in der Form Nummer/Jahr
# trennen Nummer und Jahr
Nummer=${A%/*}
Jahr=${A#*/}

# prĂŒfen, ob Nummer ein-, zwei- oder dreistellig ist, um die Anzahl einzufĂŒgender
# Nullen festzulegen zu können.
# vierstellig dĂŒrfte bei mir kaum vorkommen

# Das 'Nummernfeld' in der Kontoauszugbezeichnung muss letztendlich
# sechsstellig sein.

if [ $Nummer -lt 10 ]
#einstellig
then
NullStr="_00000"
elif
[ $Nummer -lt 100 ]
# zweistellig
then
NullStr="_0000"
else
# dreistellig
NullStr="_000"
fi

mv $Name "Auszug"$Jahr$NullStr$Nummer".pdf"

#v-

Rolf

Stefan Reuther

unread,
Mar 12, 2023, 5:04:21 AM3/12/23
to
Am 11.03.2023 um 20:05 schrieb Helmut Waitzmann:
> Stefan Reuther <stefa...@arcor.de>:
>> Ich mach seit 25+ Jahren Linux, und mir ist erst vor wenigen Wochen
>> bewusst geworden, dass es Stellen gibt, wo tatsÀchlich zwischen den
>> ZustÀnden "nicht gesetzt" und "leer" von Umgebungsvariablen
>> unterschieden wird
>
> Ein (Extrem‐) Beispiel ist die Umgebungsvariable «POSIXLY_CORRECT», die
> von GNU‐Programmen beachtet wird.  Entscheidend ist bei ihr nicht,
> welchen Inhalt sie hat, sondern nur, ob es sie gibt.

In meinem Fall war es ganz banal CFLAGS.

`CFLAGS= ./configure` sorgt NICHT nur dafĂŒr, dass die (von anderswo
vorgegebenen) CFLAGS ignoriert werden und `configure` sich selber welche
ausdenkt, sondern bewirkt, dass einfach fĂŒr den Compiliervorgang keine
Flags benutzt werden.

Das sorgt also dafĂŒr, dass ohne Optimierung gebaut wird (`configure`
nimmt normalerweise `-O2`).

Das sorgt dafĂŒr, dass `__attribute__((always_inline))` nicht wirksam wird.

Das sorgt dafĂŒr, dass ein MinGW Cross-GCC seine Standardbibliothek nicht
zusammengebaut bekommt.

Und jetzt debug das mal, wenn alles was du hast, die Meldung "ld:
undefined symbol" ist.


Stefan

Helmut Waitzmann

unread,
Mar 12, 2023, 8:20:23 AM3/12/23
to
Rolf Buenning <r.bue...@gmx.de>:

> Nachdem meine Script nach etlichen Überarbeitungen nun "fertig"
> ist, möchte ich es euch mal zeigen.
>
> #!/bin/bash
> # Umbenennung eines falsch bezeichneten Kontoauszugs
>
> Name=Auszug.pdf
> NullStr=""
>
> A=$(grep --text Kontoauszug Auszug.pdf | awk '{print $3}')
> # A enthÀlt jetzt die Auszugnummer und das Jahr in der
> # Form Nummer/Jahr
> # trennen Nummer und Jahr
> Nummer=${A%/*}
> Jahr=${A#*/}
>
> # prĂŒfen, ob Nummer ein-, zwei- oder dreistellig ist, um
> # die Anzahl einzufĂŒgender Nullen festzulegen zu können.
> # vierstellig dĂŒrfte bei mir kaum vorkommen
>
> # Das 'Nummernfeld' in der Kontoauszugbezeichnung muss
> # letztendlich sechsstellig sein.
>
> if [ $Nummer -lt 10 ]
> #einstellig
> then
> NullStr="_00000"
> elif
> [ $Nummer -lt 100 ]
> # zweistellig
> then
> NullStr="_0000"
> else
> # dreistellig
> NullStr="_000"
> fi

Da hÀtte ich dir elegantere und robustere VorschlÀge, die nötige
Anzahl von fĂŒhrenden Nullen aufzufĂŒllen:

(1) Nutze die FÀhigkeit von «printf», Zahlen mit einer
Mindestanzahl von Ziffern auszugeben:  Das Shell‐Kommando

Nummer="$( printf '%1.6d\n' "$Nummer" )"

liefert dir die Zahl mit einer Mindestanzahl von 6 Ziffern (mehr
Ziffern nur dann, wenn sie in 6 Ziffern nicht hineinpasst).

Wenn du lieber kein Programm (hier: «printf») aufrufen möchtest,
um den Rechenaufwand des Shell‐Skripts möglichst klein zu
halten[1], kannst du auch mit Bordmitteln des Shells arbeiten:

[1] Heutige Shells (beispielsweise auch «bash») haben allerdings
«printf» meist eingebaut.  Daher zieht das Argument, einen
Programmaufruf zu vermeiden, bei «printf» allermeist nicht mehr.

(2) Wenn sichergestellt ist, dass «"$Nummer"» immer eine
vorzeichenlose Zahl aus höchstens 6 Ziffern ist, kann man die
Mindestanzahl von Ziffern (hier: 6) erreichen, indem man zunÀchst
die entsprechende Anzahl (hier: 6) von Nullen vorne dranklebt. 
Dadurch erhÀlt man eine Darstellung, die mindestens so viele
Ziffern wie nötig (hier: 6) hat.

Möglicherweise sind dann aber zu viele fĂŒhrende Nullen
vorhanden.  Man muss dann vorne so viele Ziffern abschneiden,
dass 6 ĂŒbrig bleiben.  Das kriegt man so hin:

Man schneidet zunĂ€chst testweise hinten die gewĂŒnschten 6 Ziffern
ab, um die Ziffern zu ermitteln, die vorne ĂŒberzĂ€hlig sind.  Dann
schneidet man diese vorne ĂŒberflĂŒssigen Ziffern vorne von der
gesamten Ziffernfolge ab, um die gewĂŒnschten letzten 6 Ziffern zu
erhalten:

Nummer=000000"$Nummer" &&
Nummer="${Nummer#"${Nummer%??????}"}"

> mv $Name "Auszug"$Jahr$NullStr$Nummer".pdf"

mv -- "$Name" Auszug"${Jahr}_${Nummer}".pdf

Anmerkung/Rat:

Verwende Variablenauswertungen grundsÀtzlich immer in
AnfĂŒhrungszeichen («"$Variable"»), es sei denn, du möchtest die
besonderen Effekte, die eine Auswertung ohne AnfĂŒhrungszeichen
(«$Variable») verursacht, haben.

Die besonderen Effekte der Variablenauswertung ohne
AnfĂŒhrungszeichen sind folgende:  Der Variableninhalt wird
anschließend an allen Stellen, die eines aus der in der Variablen
«IFS» aufgezÀhlten Zeichen enthÀlt, in zwei Teile zerbrochen. 
Dadurch erhÀlt man mehrere Teile statt nur einen.  Je nachdem, ob
die Shell‐Option «-f» aus‐ oder eingeschaltet ist, wird das
Erhaltene anschließend noch daraufhin untersucht, ob es
vielleicht Dateinamensmuster mit Jokerzeichen («*», «?», [
])
darstellt, und, falls das der Fall ist, durch die Namen der auf
die Muster passenden Dateien ersetzt.

Dass der allermeist gewĂŒnschte Fall umstĂ€ndlicher – mit
AnfĂŒhrungszeichen – zu schreiben ist als der Spezialfall der
Sonderbehandlung – ohne AnfĂŒhrungszeichen –, dĂŒrfte der
historischen Entwicklung des Shells und seiner Skriptsprache
geschuldet sein.

Rolf Buenning

unread,
Mar 12, 2023, 10:07:15 AM3/12/23
to
Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
>
> Hier mal eine Idee, wie so etwas in Python aussehen könnte. Mangels
> Datei "Kontoauszug.pdf" konnte ich das Programm hier natĂŒrlich nicht
> testen. Es ist daher nur zum Lesen gedacht, nicht zum AusfĂŒhren!
>

Die Datei Kontoauszug kann man sich auch selber machen.
Es muss nur Jahr/Nummer im 3. Feld (so wie awk das sieht) stehen.
Der Rest ist beliebig.

Deinen Python-Vorschlag probiere ich aus.

Rolf

Rolf Buenning

unread,
Mar 12, 2023, 11:07:23 AM3/12/23
to
Thomas Noll <-_tn...@web.de> schrieb:
> Am 12 Mar 2023 08:46:20 GMT schrieb Rolf Buenning:
>
>> Nachdem meine Script nach etlichen Überarbeitungen nun "fertig" ist,
>> möchte ich es euch mal zeigen.
>
> Ich wĂŒrde den Dateinamen eher so zusammenbauen:
>
> printf -v Zielname 'Auszug_%04d_%06d.pdf' "${Jahr}" "${Nummer}"
> mv -i -- "${Name}" "${Zielname}"
>
> Dann kann die Nummer auch sechsstellig sein.
>

OK, das Àndere ich, dann spare ich den ganzen Anzahl-Stellen-check.

Dank Rolf

Rolf Buenning

unread,
Mar 12, 2023, 11:09:26 AM3/12/23
to
Helmut Waitzmann <nn.th...@xoxy.net> schrieb:
> Rolf Buenning <r.bue...@gmx.de>:
>
>> Nachdem meine Script nach etlichen Überarbeitungen nun "fertig"
>> ist, möchte ich es euch mal zeigen.

Habe ich schon gemacht, s.a. Vorposter.

Rolf

Rolf Buenning

unread,
Mar 12, 2023, 11:44:46 AM3/12/23
to
Rolf Buenning <r.bue...@gmx.de> schrieb:
Habe ich geÀndert.
Das script wird immer kĂŒrzer (und schöner).
Danke
Rolf

Dr Eberhard W Lisse

unread,
Mar 12, 2023, 6:59:02 PM3/12/23
to
Das kann man ggfs auch noch erweitern

v=39/2023
IFS='/' read -a V <<< $v
echo "${V[0]}"
echo ${V[1]}
echo ${V[@]}

mfg, el

On 08/03/2023 11:10, Stefan Ram wrote:
> Rolf Buenning <r.bue...@gmx.de> writes:
>> Eine Variable enthÀlt "39/2023".
>
> Hier unter bash:
>
> $ v=39/2023; IFS=/ read -r v1 v2 <<< $v; echo $v, $v1, $v2
> 39/2023, 39, 2023
>
> .
>
>

Dr Eberhard W Lisse

unread,
Mar 12, 2023, 7:03:50 PM3/12/23
to
Eine ganz dumme Frage, kann die Bank das auch mit CSV oder gleich
mit OFX?

Ich hatte ein Àhnliches Problem mit einer auswÀrtigen Bank, da
habe ich dann die KontoauszĂŒge aus CSV in ein lesbares PDF
geLaTeXed :-)-O und mein Stuerberater war es zufrieden :-)-O

mfg, el

Rolf Buenning

unread,
Mar 13, 2023, 4:06:09 AM3/13/23
to
Dr Eberhard W Lisse <nos...@lisse.NA> schrieb:
> Eine ganz dumme Frage, kann die Bank das auch mit CSV oder gleich
> mit OFX?

Keine Ahnung.

Ich benutze Moneyplex von Matrica, da kann man sich fĂŒr die Banken, die
benutzt werden, die unterstĂŒtzten GeschĂ€ftsvorfĂ€lle anzeigen lassen.
Aber das heisst nicht, dass die Banken auch tun.

Die DKB hat könnte z.B. Auch KontoauszĂŒge als PDF liefern, tut dies aber
nicht, sondern liefert nur .940.
Die kann ich nicht verwursten, lesen schon.

Gruss Rolf

Rolf Buenning

unread,
Mar 13, 2023, 1:21:14 PM3/13/23
to
Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
> Rolf Buenning <r.bue...@gmx.de> writes:
>># Umbenennung eines falsch bezeichneten Kontoauszugs
>
> Hier mal eine Idee, wie so etwas in Python aussehen könnte. Mangels
>
> # Python 3.9
>
> import os
>
> name = 'Auszug.pdf'
>
> zeilen = open( name, 'rb' ).read().split( b'\n' )
> a =[ line for line in zeilen if b'Kontoauszug' in line ][ 0 ]\
> .split()[ 2 ]
>
> nummer, jahr = a.split( b'/' )
>
> null_str = b'_00000'[: 7 - len( nummer )]
> os.rename( name, b'Auszug' + jahr + null_str + nummer + b'.pdf' )
>

Habe ich ausprobiert, funktioniert.
Jetzt muss ich das nur noch verstehen.

Gruss Rolf

Rolf Buenning

unread,
Mar 14, 2023, 3:39:33 AM3/14/23
to
>>Stefan Ram <r...@zedat.fu-berlin.de> schrieb:
>>>import os
>
>

Danke fĂŒr deine MĂŒhe, mir das zu erklĂ€ren.
Ich habe zwar schon ein wenig mit Python gemacht, aber bisher
nur an der OberflÀche gekratzt.
Steht aber nach wie vor in der ToDo-Liste.
Wie auch Perl.

Gruss Rolf

Dr Eberhard W Lisse

unread,
Mar 14, 2023, 5:04:55 PM3/14/23
to
https://matrica.de/produkte/produktmpx.html

sage aber das MT940 unterstĂŒtzt wird...

el

Rolf Buenning

unread,
Mar 15, 2023, 12:23:37 PM3/15/23
to
Dr Eberhard W Lisse <nos...@lisse.NA> schrieb:
> https://matrica.de/produkte/produktmpx.html
>
> sage aber das MT940 unterstĂŒtzt wird...
>
> On 13/03/2023 03:06, Rolf Buenning wrote:
>>
>> Die DKB hat könnte z.B. Auch KontoauszĂŒge als PDF liefern, tut
>> dies aber nicht, sondern liefert nur .940. Die kann ich nicht
>> verwursten, lesen schon.

Ja, das stimmt, habe nicht wirklich nachgesehen bzw. nachgedacht.
Damit kann mein Programm aber nichts anfangen, nur lesen (und speichern
natĂŒrlich).
0 new messages