String ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mar6306011
Beiträge: 25
Registriert: 31.12.2016 20:27:13

String ersetzen

Beitrag von mar6306011 » 16.06.2024 22:58:13

Hallo Leute!
Ich habe eine Variable mit folgendem Beispielinhalt:
x="abc naechster Eintrag aufzaehlungen,x=bsp1,bsp2,bsp3,bsp4 letzte_spalte"

Ich möchte nun den Teil "x=bsp1" ersetzen, wobei ich im Voraus nicht weiß, was nach "x=" steht.
Ich hatte folgende Lösungsidee, doch leider war diese nicht von Erfolg gekrönt.
echo "${x/x=*,/x=bsp_neu,}"
Die Ausgabe sieht folgendermaßen aus:
abc naechster Eintrag aufzaehlungen,x=bsp_neu,bsp4 letzte_spalte

Jetzt sind auch "bsp2" und "bsp3" verschwunden, weil bis zum letzten "," ersetzt wurde und nicht bis zum ersten Beistrich.
Das Ergebnis sollte so aussehen:
abc naechster Eintrag aufzaehlungen,x=bsp_neu,bsp2,bsp3,bsp4 letzte_spalte

Gibt es eine einfach Möglichkeit, dass nur bis zum ersten Beistrich gesucht wird?

Vielen Dank im Voraus.
LG Martin


Edit JTH: Nach „Softwareentwicklung und -paketierung, Scripting“ verschoben
Zuletzt geändert von JTH am 16.06.2024 23:29:46, insgesamt 1-mal geändert.
Grund: Nach „Softwareentwicklung und -paketierung, Scripting“ verschoben

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

Re: String ersetzen

Beitrag von JTH » 16.06.2024 23:38:27

Da ${var/pattern/replacement}, meine ich, ein Bash-, aber kein Posix-Shell-Feature ist, geh ich mal davon aus, dass du die Bash benutzt.

Mit dem einfachen * wird es nicht klappen, die Pattern-Substitution nimmt nämlich immer den längsten Match:
man bash hat geschrieben: ${parameter/pattern/string}
Pattern substitution. […] Parameter is expanded and the longest match of pattern against its value is replaced with string.

Man könnte sich aber mit den zusätzlichen Möglichkeiten von extglob helfen:

Code: Alles auswählen

shopt -s extglob
echo "${var/x=+([:alnum:]),/x=bsp_neu,}"
Statt alnum mag eine andere Characterklasse für deine Anwendung passender sein.

Wenn es noch „komplizierter“ wird, mag eine ganz andere Herangehensweise oder der Griff zu sed, awk o.ä. sinnvoller sein.
Manchmal bekannt als Just (another) Terminal Hacker.

mar6306011
Beiträge: 25
Registriert: 31.12.2016 20:27:13

Re: String ersetzen

Beitrag von mar6306011 » 16.06.2024 23:52:17

Vielen Dank, ja es ist die Bash.

Ich habe jetzt mal grep ausprobiert, um zu sehen, wie es bei einem Regulären-Ausdruck aussieht, ob meine Idee korrekt umgesetzt wird.

Code: Alles auswählen

echo "$x" | grep -E -o "x=.*,"
x=bsp1,bsp2,bsp3,
Aber hier ist ebenfalls bis zum letzten Beistrich gesucht worden.
LG Martin

tobo
Beiträge: 2114
Registriert: 10.12.2008 10:51:41

Re: String ersetzen

Beitrag von tobo » 17.06.2024 00:02:08

Dein * ist gefräßig und nimmt den längsten Treffer, *? stellt das ab und nimmt den kürzesten:

Code: Alles auswählen

$ echo "$x" | grep -Po "x=.*?,"
x=bsp1,
$ echo "$x" | grep -Eo 'x=[^,]+,'
x=bsp1,
$ sed -E 's/x=[^,]+/x=bsp_neu/' <<< "$x"
abc naechster Eintrag aufzaehlungen,x=bsp_neu,bsp2,bsp3,bsp4 letzte_spalte
$

mar6306011
Beiträge: 25
Registriert: 31.12.2016 20:27:13

Re: String ersetzen

Beitrag von mar6306011 » 17.06.2024 08:27:35

Hallo Tobo!
Ich danke dir ganz herzlich für die Problemlösung.
LG Martin

mar6306011
Beiträge: 25
Registriert: 31.12.2016 20:27:13

Re: String ersetzen

Beitrag von mar6306011 » 17.06.2024 18:28:01

Hallo Leute!
Eine kurze Frage habe ich noch zum vorhergehenden Beispiel:
Bei "grep -Eo" werden Extended-Regexp angewendet. Dort kann man anscheinend nicht die Gefräßigkeit des "*" mit einem nachfolgenden "?" eindämmen?

Dann habe ich noch bitte ein paar grundsätzliche Fragen. Ich stehe bei den RegExpr ganz am Anfang. Das Verwirrendste für mich ist, dass es verschiedene Ausprägungen davon gibt, sich die Syntax ähnlich ist, aber eben nicht gleich und wann welche von welchem Programm verwendet wird?

1. Ich möchte mich mit dem Thema mehr beschäftigen. Kann mir jemand bitte ein gutes Buch dazu empfehlen?

2.
Ich habe vor, zukünftig Regexpr in Bash-Skripten zu verwenden, bei:
if [[ "$x" =~ Regexpr ]]; then...
grep
sed
Wäre es empfehlenswert mit den Extended-Regexp anzufangen?

3. Werden die auch von if [[ .. ]]; then unterstützt?

4. Reichen Extended-Regexp aus oder wäre es empfehlenswert, sich andere Arten von Rexexpr auch anzusehen?

Vielen Dank im Voraus.
LG Martin

tobo
Beiträge: 2114
Registriert: 10.12.2008 10:51:41

Re: String ersetzen

Beitrag von tobo » 17.06.2024 19:09:16

mar6306011 hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 18:28:01
1. Ich möchte mich mit dem Thema mehr beschäftigen. Kann mir jemand bitte ein gutes Buch dazu empfehlen?
Im RegEx-Tutorial-Umfeld gibt es auch eine Bücherliste, in der auch Friedls "Mastering regular expressions" erwähnt wird. Dieses Tutorial könnte aber ein guter und einfacherer Einstiegspunkt sein.
3. Werden die auch von if [[ .. ]]; then unterstützt?
man bash hat geschrieben: An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered a POSIX extended regular expression and matched accordingly (using the POSIX regcomp and regexec interfaces usually described in regex(3)).

Antworten