Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von tobo » 05.04.2022 01:56:37

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 00:58:56
Es gibt nicht nur ein paar Varianten, sondern die unterscheiden sich auch in der „Gefräßigkeit“, so ist die bei sed nicht umschaltbar,
Geht in sed nicht direkt - man würde eine negative Zeichenklasse ([^a]*a) benutzen.

1.

Code: Alles auswählen

[,$]
Behandelt keine Zeilenenden, sondern ist eine Zeichenklasse bestehend aus den Zeichen , und $.

Code: Alles auswählen

$ echo "Variable2=9,1,99,4,9,2,9,2,9" | sed -E '/^Variable2/s/([=,])9(,|$)/\17\2/g'
Variable2=7,1,99,4,7,2,7,2,7
2 Verstehe ich nicht - zu wenig Beispiel, zuviel Prosa (oder zu spät).

Edit: Abgetrennt nach viewtopic.php?p=1299317#p1299317
Zuletzt geändert von JTH am 05.04.2022 21:17:47, insgesamt 1-mal geändert.
Grund: Abgetrennt nach https://debianforum.de/forum/viewtopic.php?p=1299317#p1299317

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: RegExp-Kurs 01: Motivation

Beitrag von Christoph Franzen » 05.04.2022 03:23:14

tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 01:56:37
Behandelt keine Zeilenenden, sondern ist eine Zeichenklasse bestehend aus den Zeichen , und $.
Wußte ich doch, daß ich irgendwo einen Fehler eingebaut hatte; bei meinem Ursprungsproblem hatte ich das auch mit 3 -e s/…/…/ formuliert und dann beim Vereinfachen für das Beispiel gedacht, das könnte man doch zusammenfassen. Sowas sind die Tücken dabei, daß das $ in [] wieder wörtlich genommen wird.

Wußte ich noch nicht, daß man:

Code: Alles auswählen

/^Variable2/
dem s-Kommando voranstellen kann, hat so aber einen Schönheitsfehler: würde auch eventuelle weitere Zeilen, beispielsweise „Variable23“ bearbeiten. Kann man sowas schreiben:

Code: Alles auswählen

/^Variable2=/s/([=,])9(,|$)/\17\2/g
oder muß das „überschneidungsfrei“ sein, das heißt, fängt das s erst nach dem „Vorspann“ zu suchen an oder am Zeilenanfang?

Das Ausweichen auf Negativklassen war ja hier doch nicht nötig, ginge aber auch nur dann, wenn man keine „Negativ-Sequenzen“ (finde alles beginnend mit Variable=, was kein ,9, ist, gefolgt von ,9,) braucht.
tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 01:56:37
2 Verstehe ich nicht - zu wenig Beispiel, zuviel Prosa (oder zu spät).
Es ging darum, eine Shell-Variable in den Suchausdruck einzusetzen – und zwar unmittelbar vor einem Zeilen-End-$.

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTA$/\1,$ERSATZWORT/
ist auf seltsame Weise anders als:

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTB,/\1,$ERSATZWORT,/
. So werden die Inhalte von sowohl $ANFANG, als auch $SUCHWORTB korrekt eingesetzt, jedoch muß man bei $SUCHWORTA, das direkt vor dem $ steht, den ersten, den „Variablen-$“, mit gleich 2 \\ „maskieren“ oder den gesamten (Teil-)Ausdruck in eine Variable schreiben, die man dann sed vorsetzt.
Christoph

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

Re: RegExp-Kurs 01: Motivation

Beitrag von tobo » 05.04.2022 11:51:27

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 03:23:14
tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 01:56:37
Behandelt keine Zeilenenden, sondern ist eine Zeichenklasse bestehend aus den Zeichen , und $.
Wußte ich doch, daß ich irgendwo einen Fehler eingebaut hatte; bei meinem Ursprungsproblem hatte ich das auch mit 3 -e s/…/…/ formuliert und dann beim Vereinfachen für das Beispiel gedacht, das könnte man doch zusammenfassen. Sowas sind die Tücken dabei, daß das $ in [] wieder wörtlich genommen wird.
In Zeichenklassen und im sed-Ersetzungsteil stehen Literale, da wird also alles "wörtlich" genommen. Benutzt du darin das Zeichen, das du zum Quoten des ganzen sed-Ausdrucks benutzt (" oder '), dann solltest du aber trotzdem Escapen (\). Der Shell zuliebe...
Wußte ich noch nicht, daß man:

Code: Alles auswählen

/^Variable2/
dem s-Kommando voranstellen kann, hat so aber einen Schönheitsfehler: würde auch eventuelle weitere Zeilen, beispielsweise „Variable23“ bearbeiten. Kann man sowas schreiben:

Code: Alles auswählen

/^Variable2=/s/([=,])9(,|$)/\17\2/g
oder muß das „überschneidungsfrei“ sein, das heißt, fängt das s erst nach dem „Vorspann“ zu suchen an oder am Zeilenanfang?
Ja, da kann man das = oder ein [^0-9] anhängen, da überschneidet nichts. Der nachfolgende sed-Ausdruck behandelt wieder die ganze Zeile. Allerdings hast du mich mit diesem "überschneidungsfrei" jetzt auf einen eigenen Fehler (doppelt "verwendetes" ,) aufmerksam gemacht. Siehe

Code: Alles auswählen

$ echo "Variable2=9,1,99,4,9,9,9,2,9" | sed -E '/^Variable2/s/([=,])9(,|$)/\17\2/g'
Variable2=7,1,99,4,7,9,7,2,7
Lookahead und Lookbehind gibt es in sed nicht, da wäre die Zeichenkette noch nicht "verbraucht". Macht man halt eine Schleife mit t und springt zur definierten Marke mark, wenn eine Substitution erfolgte und beginnt wieder am Anfang der Zeichenkette.

Code: Alles auswählen

$ echo "Variable2=9,1,99,4,9,9,9,2,9" | sed -E '/^Variable2/{:mark; s/(=|,)9(,|$)/\17\2/;t mark}'
Variable2=7,1,99,4,7,7,7,2,7
Es ging darum, eine Shell-Variable in den Suchausdruck einzusetzen – und zwar unmittelbar vor einem Zeilen-End-$.

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTA$/\1,$ERSATZWORT/
ist auf seltsame Weise anders als:

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTB,/\1,$ERSATZWORT,/
. So werden die Inhalte von sowohl $ANFANG, als auch $SUCHWORTB korrekt eingesetzt, jedoch muß man bei $SUCHWORTA, das direkt vor dem $ steht, den ersten, den „Variablen-$“, mit gleich 2 \\ „maskieren“ oder den gesamten (Teil-)Ausdruck in eine Variable schreiben, die man dann sed vorsetzt.
Kann ich jetzt so nicht nachvollzeihen. Variablennamen bestehen aus [a-z], [0-9] und dem _. Um sie von der Umgebung leserlich abzugrenzen, schreibt man sie häufig in {}, also z.B. ${SUCHWORT}. Man umgeht damit auch Namenkollisionen, wie z.B. bei ${var1} und $var12. Was das doppelte Escapen angeht, das sollte eigentlich gerade falsch sein, da damit ein $-Literal geschaffen wird.

EDIT: sed-Ausdruck breichtigt.
Zuletzt geändert von tobo am 06.04.2022 01:07:37, insgesamt 1-mal geändert.

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: RegExp-Kurs 01: Motivation

Beitrag von Christoph Franzen » 05.04.2022 20:26:05

tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 11:51:27
Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 03:23:14
Es ging darum, eine Shell-Variable in den Suchausdruck einzusetzen – und zwar unmittelbar vor einem Zeilen-End-$.

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTA$/\1,$ERSATZWORT/
ist auf seltsame Weise anders als:

Code: Alles auswählen

s/\($ANFANG=.*\),$SUCHWORTB,/\1,$ERSATZWORT,/
. So werden die Inhalte von sowohl $ANFANG, als auch $SUCHWORTB korrekt eingesetzt, jedoch muß man bei $SUCHWORTA, das direkt vor dem $ steht, den ersten, den „Variablen-$“, mit gleich 2 \\ „maskieren“ oder den gesamten (Teil-)Ausdruck in eine Variable schreiben, die man dann sed vorsetzt.
Kann ich jetzt so nicht nachvollzeihen. Variablennamen bestehen aus [a-z], [0-9] und dem _. Um sie von der Umgebung leserlich abzugrenzen, schreibt man sie häufig in {}, also z.B. ${SUCHWORT}. Man umgeht damit auch Namenkollisionen, wie z.B. bei ${var1} und $var12. Was das doppelte Escapen angeht, das sollte eigentlich gerade falsch sein, da damit ein $-Literal geschaffen wird.
Richtig — das mit den \\ habe ich durch Wildes Experimentieren herausgefunden und kam mir auch spontan sowas von extrem falsch vor.

Ein wenig Hintergrund: bei dem Problem habe ich erwogen, das Ergebnis meiner Mühen allgemein verfügbar zu machen, so sollte es Bourne-kompatibel bleiben. Bei näherer Betrachtung fällt auf, daß zumindest alle in Gebrauch befindlichen modernen Implementierungen diese Variablen-Klammern kennen sollten, hatte ich aber nicht „auf dem Schirm“.

Zur Verwirrung könnte beitragen, daß meine interaktive Shell die Bash ist, /bin/sh hingegen Dash (Debian Almquist Shell), es ist also ein Unterschied, ob ich was auf der Kommandozeile teste oder in ein Skript mit „#!/bin/sh“ am Anfang schreibe, was hier im Forum indes der „typische Fall“ sein düfte.

Gerade kriege ich es selber mit einem vereinfachten, neuen Beispiel nicht nachvollzogen:

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,${letzteZahl}$/,Ä/
GEHT NICHT.

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,\\$letzteZahl$/,Ä/
GEHT AUCH NICHT; nicht mit beliebigen Anzahlen von „\“. Ich bin verwirrt.
Christoph

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

Re: RegExp-Kurs 01: Motivation

Beitrag von JTH » 05.04.2022 20:48:25

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:26:05
Gerade kriege ich es selber mit einem vereinfachten, neuen Beispiel nicht nachvollzogen:

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,${letzteZahl}$/,Ä/
GEHT NICHT.

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,\\$letzteZahl$/,Ä/
GEHT AUCH NICHT; nicht mit beliebigen Anzahlen von „\“. Ich bin verwirrt.
Das kann auch beides nicht funktionieren. Eine Variablenzuweisung direkt vor einem Kommando a la

Code: Alles auswählen

var=value some_command -a -b -c
ist eine temporäre Umgebungsvariable in der Umgebung des aufzurufenen Kommandos. Sie existiert aber an der Stelle, wo die $letzteZahl ersetzt wird – in der aufrufenden Shell, nicht. Dafür musst du folgendes tun:

Code: Alles auswählen

letzteZahl=4; echo Var=4,3,4,4 | sed -e s/,${letzteZahl}$/,Ä/

Ich hab das Gefühl, dass diese Fachsimpelei schon recht weit weg ist von Meillos Eingangsbeitrag und vielleicht das Thema unübersichtlich macht. Vielleicht sollte das mal ein Mod abtrennen(?) *hust*
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: RegExp-Kurs 01: Motivation

Beitrag von tobo » 05.04.2022 20:56:18

Außerdem ist das ja auch ein Shell-Problem und kein RegEx-Problem...

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: RegExp-Kurs 01: Motivation

Beitrag von Christoph Franzen » 05.04.2022 21:15:06

JTH hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:48:25
Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:26:05
Gerade kriege ich es selber mit einem vereinfachten, neuen Beispiel nicht nachvollzogen:

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,${letzteZahl}$/,Ä/
GEHT NICHT.

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,\\$letzteZahl$/,Ä/
GEHT AUCH NICHT; nicht mit beliebigen Anzahlen von „\“. Ich bin verwirrt.
Das kann auch beides nicht funktionieren. Eine Variablenzuweisung direkt vor einem Kommando a la

Code: Alles auswählen

var=value some_command -a -b -c
ist eine temporäre Umgebungsvariable in der Umgebung des aufzurufenen Kommandos. Sie existiert aber an der Stelle, wo die $letzteZahl ersetzt wird – in der aufrufenden Shell, nicht. Dafür musst du folgendes tun:

Code: Alles auswählen

letzteZahl=4; echo Var=4,3,4,4 | sed -e s/,${letzteZahl}$/,Ä/
Jetzt, wo Du es schreibst… Danke!
JTH hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:48:25
Ich hab das Gefühl, dass diese Fachsimpelei schon recht weit weg ist von Meillos Eingangsbeitrag und vielleicht das Thema unübersichtlich macht. Vielleicht sollte das mal ein Mod abtrennen(?) *hust*
Wer soll das denn machen, wenn nicht Du? Ich bin „hier“ bloß Jabber-Moderator.
Christoph

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: RegExp-Kurs 01: Motivation

Beitrag von Christoph Franzen » 05.04.2022 21:20:52

tobo hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:56:18
Außerdem ist das ja auch ein Shell-Problem und kein RegEx-Problem...
<Seufz> Ich hab' die ganze Zeit schon Angst, dem Meillo seinen Kurs kaputtzumachen; mögen sich mal bitte Anfänger(innen) zu Wort melden, denen das hier zu „abgehoben“ wird?
Christoph

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

Re: RegExp-Kurs 01: Motivation

Beitrag von JTH » 05.04.2022 21:21:23

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 21:15:06
Wer soll das denn machen, wenn nicht Du? Ich bin „hier“ bloß Jabber-Moderator.
Jaja, ich hatte nur grad keine Lust, mich da durchzuklicken :oops: Ist abgetrennt :wink:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
whisper
Beiträge: 3373
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von whisper » 06.04.2022 08:57:47

Bei der Gelegenheit möchte ich auf https://aurelio.net/projects/txt2regex/
hinweisen.
Gibt es auch in oldstable im Repo.
Debiantxt2regex
Das tool gibt gleichzeitig für verschiedene Sprachen und Dialekte die regex Syntax aus.
Sehr gut zum üben.
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von eggy » 06.04.2022 09:06:37

Debianugrep ist auch ganz nett, da es mit --query ein "interaktives" grep ist.

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: RegExp-Kurs 01: Motivation

Beitrag von Christoph Franzen » 07.04.2022 21:04:53

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 21:15:06
JTH hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:48:25
Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
05.04.2022 20:26:05
Gerade kriege ich es selber mit einem vereinfachten, neuen Beispiel nicht nachvollzogen:

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,${letzteZahl}$/,Ä/
GEHT NICHT.

Code: Alles auswählen

echo Var=4,3,4,4 | letzteZahl=4 sed -e s/,\\$letzteZahl$/,Ä/
GEHT AUCH NICHT; nicht mit beliebigen Anzahlen von „\“. Ich bin verwirrt.
Das kann auch beides nicht funktionieren. Eine Variablenzuweisung direkt vor einem Kommando a la

Code: Alles auswählen

var=value some_command -a -b -c
ist eine temporäre Umgebungsvariable in der Umgebung des aufzurufenen Kommandos. Sie existiert aber an der Stelle, wo die $letzteZahl ersetzt wird – in der aufrufenden Shell, nicht. Dafür musst du folgendes tun:

Code: Alles auswählen

letzteZahl=4; echo Var=4,3,4,4 | sed -e s/,${letzteZahl}$/,Ä/
Das hatte ich ursprünglich natürlich auch anders formuliert und dann beim Umwandeln in einen übersichtlichen Einzeiler die Variable an der falschen Stelle eingesetzt. Nun aber bin ich erst recht verwirrt:

Code: Alles auswählen

letzteZahl=4 ; echo Var=4,3,4,4 | sed -e s/,$letzteZahl$/,Ä/
Var=4,3,4,Ä
geht (interaktiv) wunderbar in Bash und Dash. Also mal den ursprünglichen Test mit „history“ gesucht — statt der Datei hier ein verkürztes „echo“:

Code: Alles auswählen

$ T=0; echo a,n,0 | sed -e s/,\\$T$/,ÄÄ/
a,n,ÄÄ
$ T=0 ; echo a,n,0 | sed -e s/,\$T$/,ÄÄ/
a,n,0
$ T=0 ; echo a,n,0 | sed -e s/,$T$/,ÄÄ/
a,n,ÄÄ
Es geht also unerwarteterweise mit 2 \ und mit keinem (sollte auch, war aber in meinem Original-Skript ein Problem) und mit einem \ erwartungsgemäß nicht.
Christoph

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

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von JTH » 07.04.2022 21:29:00

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
07.04.2022 21:04:53
Es geht also unerwarteterweise mit 2 \ und mit keinem (sollte auch, war aber in meinem Original-Skript ein Problem) und mit einem \ erwartungsgemäß nicht.
Du hast damit effektiv in dem sed-Aufruf am Ende ein \0, eine Referenz in einem regulären Ausdruck. Hab leider grad keine Gelegenheit, näher drüber nachzudenken, wie letztendlich doch die Ersetzung funktioniert.

Aber wenn du der Variable T am Anfang mal z.B. eine 1, statt 0 zuweist, siehst du, dass sed sich wegen nicht vorhandener Referenz beschwert.
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: RegExp-Kurs 01: Motivation

Beitrag von tobo » 08.04.2022 00:05:20

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
07.04.2022 21:04:53

Code: Alles auswählen

$ T=0; echo a,n,0 | sed -e s/,\\$T$/,ÄÄ/
a,n,ÄÄ
Die beiden nachfolgenden Fälle sollten ja klar sein. Das was hier entsteht:

Code: Alles auswählen

$ T=0
$ echo s/,\\$T$/
s/,\0$/
$
$ echo s/,\\$T$/ | od -c
0000000   s   /   ,   \   0   $   /  \n
0000010
\\ wird durch die Shell zu \ und $T zu 0. Sed arbeitet dann effektiv mit dem weiter, was du oben siehst. \0 bedeutet 0 - du entfernst/erweiterst eine mögliche Sonderbeutung der 0, was in beiden Fällen nicht vorhanden ist. Bei einem "normalen" Zeichen macht es üblicherweise keinen Unterschied, ob davor Escaped wird (anders als bei Sonderzeichen). Bei \1 (Rückwärtsreferenz; erweitert) siehe Anmerkung von JTH, bei \^ oder \$ (entfernt) kein Anfang oder Ende der Zeile, sondern die entsprechenden Literale.

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von Christoph Franzen » 08.04.2022 01:16:24

Stimmt, mit 1 statt 0:

Code: Alles auswählen

sed: -e Ausdruck #1, Zeichen 13: Ungültiger Verweis zurück
Na super, es funktionierte zufällig genau so, weil es eine 0 war…
Christoph

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von Christoph Franzen » 08.04.2022 01:20:36

Damit wäre also alles verstanden, bis auf die Frage, was bei meiner ursprünglichen $Variable$-Konstruktion versagt hat. Das wird sicherlich auch noch herauszufinden sein…
Christoph

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

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von tobo » 08.04.2022 01:44:39

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
08.04.2022 01:16:24
Na super, es funktionierte zufällig genau so, weil es eine 0 war…
Ne, zufälligerweise würde es mit der 1 nicht funktionieren. Es gibt ja deutlich mehr Zeichen, die keine Sonderbedeutung entwickeln (im Vegleich zu [abfrntv1-9]).
Zuletzt geändert von tobo am 08.04.2022 02:16:06, insgesamt 1-mal geändert.

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von Christoph Franzen » 08.04.2022 02:04:25

tobo hat geschrieben: ↑ zum Beitrag ↑
08.04.2022 01:44:39
Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
08.04.2022 01:16:24
Na super, es funktionierte zufällig genau so, weil es eine 0 war…
Ne, zufälligerweise würde es mit der 1 nicht funktionieren. Es gibt ja deutlich mehr Zeichen, die keine Sonderbedeutung entwickeln (im Vegleich zu [abfrnt1-9]).
Zufall an sich hat ja ersteinmal nichts mit der konkreten relativen Häufigkeit zu tun. Der Tenor liegt bei der Aussage meines Erachtens doch darauf, daß ich „zufällig“ ein Zeichen ohne Sonderbedeutung gewählt hatte; wie dem auch sei, wenn man reguläre Ausdrücke in Shellscripten verwendet (und dafür natürlich grep, sed, awk, perl oder sonstwas braucht) läuft man schnell in das Problem, daß es recht unübersichtlich wird, welche Sonderbedeutung verschiedener Zeichen von welchem Programm man wie genau „wegmaskieren“ muß, um das gewünschte Ergebnis zu erreichen.
Christoph

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von Christoph Franzen » 08.04.2022 02:06:00

Mir scheint übrigens, Du könntest locker einen wertvollen Kursbeitrag leisten, tobo.
Christoph

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

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von tobo » 08.04.2022 02:35:18

Christoph Franzen hat geschrieben: ↑ zum Beitrag ↑
08.04.2022 02:04:25
wenn man reguläre Ausdrücke in Shellscripten verwendet (und dafür natürlich grep, sed, awk, perl oder sonstwas braucht) läuft man schnell in das Problem, daß es recht unübersichtlich wird, welche Sonderbedeutung verschiedener Zeichen von welchem Programm man wie genau „wegmaskieren“ muß, um das gewünschte Ergebnis zu erreichen.
Zunächst mal solte man sicherstellen, dass das jeweilige Programm auch das erhält, was man sich vorstellt. Wenn nichts dagegenspricht, dann sollte man wohl den entsprechenden Ausruck in ' einschließen. Dagegensprechen würde z.B. eine angedachte Variablen-Erweiterung, dann die '-Quotierung entweder unterbrechen oder den Ausdruck ganz mit " maskieren. Wenn's dann unabhängig von der Shell ist, dann darf man sich auf die verschiedenen Implementierungen der unterschiedlichen Regulären Ausdrücke stürzen...

Christoph Franzen
Beiträge: 197
Registriert: 22.08.2005 19:58:49
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Aachen

Re: Fachsimpelei abgetrennt aus „RegExp-Kurs 01: Motivation“

Beitrag von Christoph Franzen » 08.04.2022 02:36:56

Klar, aber sed sträubt sich schon mal, wenn man für die Shell '' einsetzen will.
Christoph

Antworten