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
String ersetzen
-
- Beiträge: 34
- Registriert: 31.12.2016 20:27:13
String ersetzen
Zuletzt geändert von JTH am 16.06.2024 23:29:46, insgesamt 1-mal geändert.
Grund: Nach „Softwareentwicklung und -paketierung, Scripting“ verschoben
Grund: Nach „Softwareentwicklung und -paketierung, Scripting“ verschoben
Re: String ersetzen
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 könnte sich aber mit den zusätzlichen Möglichkeiten von extglob helfen:
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.
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,}"
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.
-
- Beiträge: 34
- Registriert: 31.12.2016 20:27:13
Re: String ersetzen
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.
Aber hier ist ebenfalls bis zum letzten Beistrich gesucht worden.
LG Martin
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,
LG Martin
Re: String ersetzen
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
$
-
- Beiträge: 34
- Registriert: 31.12.2016 20:27:13
Re: String ersetzen
Hallo Tobo!
Ich danke dir ganz herzlich für die Problemlösung.
LG Martin
Ich danke dir ganz herzlich für die Problemlösung.
LG Martin
-
- Beiträge: 34
- Registriert: 31.12.2016 20:27:13
Re: String ersetzen
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
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
Re: String ersetzen
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.mar6306011 hat geschrieben:17.06.2024 18:28:011. Ich möchte mich mit dem Thema mehr beschäftigen. Kann mir jemand bitte ein gutes Buch dazu empfehlen?
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)).