(gelöst) Zeichen einer Zeichenkette in Variable schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fischig
Beiträge: 3639
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) Zeichen einer Zeichenkette in Variable schreiben

Beitrag von fischig » 03.08.2021 08:08:01

Ich will ein kleines bash-script schreiben und habe nicht viel Ahnung von shell-scripting.
Ich habe eine Zeichenkette in einer Variablen. Wie schreibe ich das n-te Zeichen dieser Zeichenkette in eine neue Variable?
Für das letzte Zeichen in der Variablen habe ich eine Lösung gefunden:

Code: Alles auswählen

abc=${xyz: -1}
Zuletzt geändert von fischig am 03.08.2021 17:45:30, insgesamt 1-mal geändert.

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 08:41:10

Code: Alles auswählen

:-Q a=auto

:-Q b=${a:2:1}

:-Q echo $b
t

:-Q 
Suche in der Manpage der bash nach ``Substring Expansion'', dann wirst du fuendig.
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von JTH » 03.08.2021 08:52:08

Meillo hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 08:41:10
Suche in der Manpage der bash nach ``Substring Expansion'', dann wirst du fuendig.
Wieder was gelernt :THX: Habe ich wohl noch nie gebraucht, wusste deshalb nicht, dass es von Haus aus geht.


Die Alternative mit awk: :wink:

Code: Alles auswählen

~$ awk -vFS= '{print $3}' <<< "abcdefg"
c
(Nicht ernstgemeint, das Obige ist für diesen simplen Fall einfacher.)
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 08:56:47

@JTH: :lol:
Use ed once in a while!

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 09:17:15

Auch wenn ich es natuerlich begruesse, wenn jemand awk verwendet, so ist das nicht immer das Mittel der Wahl. In diesem Fall wirkt es sperrig ... weil es dafuer einfach nicht gemacht ist (auch wenn es natuerlich funktioniert). Will man Zeichen einer Zeile extrahieren, dann ist cut(1) das richtige Werkzeug:

Code: Alles auswählen

:-Q echo auto | cut -c3
t
... insofern man es nicht mit der Bash-internen Substring Expansion machen will (die zwar nicht Teil von POSIX aber doch vermutlich in allen modernen Shells vorhanden ist).

https://pubs.opengroup.org/onlinepubs/9 ... g_18_06_02
Use ed once in a while!

fischig
Beiträge: 3639
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von fischig » 03.08.2021 09:36:05

Keine Ahnung, was bedeutet.

Ich habe Meillos Beispiel so nachvollzogen:

Code: Alles auswählen

xyz=auto
abc=${xyz:2:1}
echo $abc
Funktioniert! Danke :THX:

Was ich da gemacht habe, erkläre ich mir einstweilen so:
1. Ich habe die Zeichenkette 'auto' in die Variable xyz gesteckt.
2. Mit der zweiten Zeile weise ich die bash an, an die zweite Stelle in xyz zu springen und sich dann genau ein Zeichen dahinter zu merken und den Inhalt dieser (3.) Stelle in der Zeichenkette (im Beispiel also das 't' in 'auto') in die Variable abc zu schreiben.
3. Mit echo $abc überprüfe ich das Ganze.

Kann man sich das so merken?

Wie hat man das Konbstrukt {xyz:2:1} zu verstehen? Als eine weitere, unbenannte Variable (auf deren Inhalt ich via voranstehendem '$' zugreife?

Ich habe dann mal abc=${xyz:3:0} erfolglos probiert. Warum erfolglos?

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 09:59:08

fischig hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 09:36:05
Keine Ahnung, was bedeutet.
Das ist mein Prompt. Manchmal bin ich zu faul den jeweils durch `$' zu ersetzen.
Was ich da gemacht habe, erkläre ich mir einstweilen so:
1. Ich habe die Zeichenkette 'auto' in die Variable xyz gesteckt.
2. Mit der zweiten Zeile weise ich die bash an, an die zweite Stelle in xyz zu springen und sich dann genau ein Zeichen dahinter zu merken und den Inhalt dieser (3.) Stelle in der Zeichenkette (im Beispiel also das 't' in 'auto') in die Variable abc zu schreiben.
3. Mit echo $abc überprüfe ich das Ganze.

Kann man sich das so merken?
Ja.
Wie hat man das Konbstrukt {xyz:2:1} zu verstehen? Als eine weitere, unbenannte Variable (auf deren Inhalt ich via voranstehendem '$' zugreife?
Das Konstrukt ist nicht {...} sondern ${...}.

$a ist (fast) identisch zu ${a}.

Wenn man die Klammern verwendet kann man in ihnen nach dem Variablennamen noch verschiedene Modifikatoren nutzen, um den Variablenwert, der zurueckgeliefert wird, zu veraendern. Eine dieser Modifikationsmoeglichkeiten ist die Substring-Auswahl, die mit :pos:len eingebaut wird. (Wie genau sie funktioniert steht in der Manpage!)
Ich habe dann mal abc=${xyz:3:0} erfolglos probiert. Warum erfolglos?
Wende einfach deine eigene Erklaerung von oben darauf an und du findest die Antwort selber. ;-)
Use ed once in a while!

fischig
Beiträge: 3639
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von fischig » 03.08.2021 17:44:37

Meillo hat geschrieben:Wende einfach deine eigene Erklaerung von oben darauf an und du findest die Antwort selber. ;-)
Ich kann's mir schon denken. Aber ein direktes Anspringen des Zeichens à la

Code: Alles auswählen

abc=xyz[n]
in Pascal wäre mir sympathischer gewesen.

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 17:56:30

fischig hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 17:44:37
Meillo hat geschrieben:Wende einfach deine eigene Erklaerung von oben darauf an und du findest die Antwort selber. ;-)
Ich kann's mir schon denken.
Es waere besser, wenn du deinen Gedanken hier schriftlich formulieren wuerdest. ;-)
Aber ein direktes Anspringen des Zeichens à la

Code: Alles auswählen

abc=xyz[n]
in Pascal wäre mir sympathischer gewesen.
Das ist eine lustige Aussage ... Mir waere es auch lieber, wenn das Geschlecht der Artikel im Franzoesischen gleich wie im Deutschen waere. ;-)
Use ed once in a while!

fischig
Beiträge: 3639
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) Zeichen einer Zeichenkette in Variable schreiben

Beitrag von fischig » 03.08.2021 18:13:55

Es waere besser, wenn du deinen Gedanken hier schriftlich formulieren wuerdest. ;-)
Hatte ich das nicht schon?

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

Re: Zeichen einer Zeichenkette in Variable schreiben

Beitrag von Meillo » 03.08.2021 18:21:13

fischig hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 18:13:55
Es waere besser, wenn du deinen Gedanken hier schriftlich formulieren wuerdest. ;-)
Hatte ich das nicht schon?
Du hast folgendes geschrieben:
fischig hat geschrieben: ↑ zum Beitrag ↑
03.08.2021 09:36:05
Ich habe dann mal abc=${xyz:3:0} erfolglos probiert. Warum erfolglos?
... *nachdem* du die Funktionsweise von ${var:pos:len} erklaert hast. Da frage ich mich, warum bei dir hier noch eine Frage offen ist, wo du doch schon verstanden zu haben scheinst, wie die Substring-Expansion funktioniert.

Du schreibst, du kannst dir denken warum es erfolglos war ... aber das kommt mir irgendwie vage vor.

Darum vielleicht nochmal explizit die Frage: Sind jetzt alle deine Fragen beantwortet? Falls noch etwas offen ist: Was genau?
Use ed once in a while!

fischig
Beiträge: 3639
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) Zeichen einer Zeichenkette in Variable schreiben

Beitrag von fischig » 03.08.2021 18:34:03

Nein, keine Frage mehr offen. Warum es ist, wie es ist, ist mir klar geworden. Ich hielte den direkten Zugriff auf ein Zeichen halt für einfacher. Ist aber offenbar nicht vorgesehen. Mit der gefundenen Methode komme ich zurecht. In Pascal wäre das Pendant etwa

Code: Alles auswählen

abc=copy(xyz,n,1)

Antworten