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

sed soll ersetzen -- aber erst ab 4. Spalte

123 views
Skip to first unread message

Michael Hagedorn

unread,
Sep 15, 2022, 10:23:29 AM9/15/22
to
Hallo.
Das ist vermutlich ein Klacks für diejenigen von Euch, die sich besser
mit regulären Ausdrücken auskennen als ich.
Hier läuft ein Script, das Ersetzungen vornehmen soll, und zwar so:

cat liste.csv | sed '
s/bi\b/bi_GA/;
s/BI\b/BI_EA/;
s/ch\b/ch_GA/;
s/CH\b/CH_EA/;
s/de\b/de_GA/;
s/DE\b/DE_EA/;
s/en\b/en_GA/;
s/EN\b/EN_EA/;
s/SP\b/SP_EA/; ' > liste_neu.csv

Ein Eintrag der Liste sieht z.B. so aus:
1100018;Beksten;Mathis;ch;EK;EN;GE;;ma;mu;sf;sp;
Die Anzahl der Spalten hinter dem Namen ist für jeden Eintrag
unterschiedlich lang; die ersten drei Spalten sind aber immer für eine
ID und den Vor- und Zunamen reserviert.

Man sieht schon, was passiert: Der Eintrag für "en" wird auch im
Nachnamen gefunden, so dass der Name dann zu
Beksten_GA; wird. Es müsste also so sein, dass der sed-Befehl erst ab
der 4. Spalte loslegt und danach die Einträge ersetzt. Ich habe bisher
leider nichts brauchbares gefunden.
Vielen Dank mal wieder.

Helmut Waitzmann

unread,
Sep 15, 2022, 4:04:18 PM9/15/22
to
Michael Hagedorn <herr-h...@gmx.de>:
Du erwartest im Ernst, mit Suchen etwas Brauchbares zu finden? 
Aber wonach soll man in deinem Fall suchen?  Es ist ziemlich
unwahrscheinlich, dass irgend jemand genau deine Aufgabe schon
gelöst hat.

Die einzige Möglichkeit, ans Ziel zu kommen, ist reguläre
Ausdrücke im Allgemeinen und «sed» im Besonderen zu verstehen und
dann selber ans Werk zu gehen:

sed -E -e '
:nochmal1
/^(([^;]+)(;[^;]*){2,});(bi|ch|de|en);/{
s//\1;\4_GA;/
t nochmal1
}
:nochmal2
/^(([^;]+)(;[^;]*){2,});(BI|CH|DE|EN|SP);/{
s//\1;\4_EA;/
t nochmal2
}' -- \
liste.csv > liste_neu.csv

Michael Schütz

unread,
Sep 16, 2022, 1:11:03 AM9/16/22
to
Michael Hagedorn <herr-h...@gmx.de> schrieb:
> Hallo.
>...
> Ein Eintrag der Liste sieht z.B. so aus:
> 1100018;Beksten;Mathis;ch;EK;EN;GE;;ma;mu;sf;sp;
> Die Anzahl der Spalten hinter dem Namen ist für jeden Eintrag
> unterschiedlich lang; die ersten drei Spalten sind aber immer für eine
> ID und den Vor- und Zunamen reserviert.
>
> Man sieht schon, was passiert: Der Eintrag für "en" wird auch im
> Nachnamen gefunden, so dass der Name dann zu
> Beksten_GA; wird. Es müsste also so sein, dass der sed-Befehl erst ab
> der 4. Spalte loslegt und danach die Einträge ersetzt. Ich habe bisher
> leider nichts brauchbares gefunden.

Hallo,

wie man 'sed' zählen beibringt, weiß ich nicht, aber Du könntest die
Trennzeichen mit in das Muster nehmen.

sed 's/;en;/;en_GA;/' liste

> Vielen Dank mal wieder.

Vielleicht hilt es.

Schultze

--
I've got nothing against God. It's his Fan Club I can't stand.

Stefan Wiens

unread,
Sep 16, 2022, 2:24:37 AM9/16/22
to
Michael Schütz <der.sc...@web.de> writes:

> wie man 'sed' zählen beibringt,

,----[ inc.sed ]
| #!/bin/sed -f
| s/.*/0&:;0123456789:0/
| : inc
| s/\(.\):\(.*;.*\1\(:*.\)\)/\3\2/
| t inc
| s/^0*\(.*\);.*/\1/
`----

$ echo 129 | ./inc.sed
130


Ansonsten siehe dc.sed aus GNU-Sed.

--
Stefan

Tim Landscheidt

unread,
Sep 16, 2022, 4:02:52 AM9/16/22
to
Für mich wäre da der Punkt erreicht, wo ich zu einer richti-
gen Programmiersprache greifen würde :-). In Python sähe das
in der Basisversion beispielsweise so aus:

| #!/usr/bin/python3

| import csv
| import sys

| ersetzungen = {
| 'bi': 'bi_GA',
| 'BI': 'BI_EA',
| 'ch': 'ch_GA',
| 'CH': 'CH_EA',
| 'de': 'de_GA',
| 'DE': 'DE_EA',
| 'en': 'en_GA',
| 'EN': 'EN_EA',
| 'SP': 'SP_EA',
| }

| csvreader = csv.reader(sys.stdin, delimiter=';')
| csvwriter = csv.writer(sys.stdout, delimiter=';', lineterminator='\n')
| for zeile in csvreader:
| if zeile[5] in ersetzungen:
| zeile[5] = ersetzungen[zeile[5]]
| csvwriter.writerow(zeile)

Da kann man auch noch in einem Jahr erahnen, was der Code
tun soll, und wenn sich an der Struktur oder den Aufgaben
etwas ändert, lässt sich das Script deutlich schneller an-
passen, als in regulären Ausdrücken herumzuwühlen.

Der wesentliche Nachteil besteht darin, dass man das
schlecht in einen Einzeiler quetschen kann, das heißt, man
muss, wenn man das Shell-Script „behalten“ will, zwei Datei-
en pflegen, installieren, versionieren, etc. Aber der massiv
sinkende Wartungsaufwand ist es IMNSHO allemal wert.

Tim

Axel Reichert

unread,
Sep 16, 2022, 8:24:04 AM9/16/22
to
echo '1100018;Beksten;Mathis;ch;EK;EN;GE;;ma;mu;sf;sp;' \
| awk 'BEGIN {FS = ";"; OFS = ";"} \
{for (i=4; i<NF; i++) { \
$(i) = gensub(/(bi|ch|de|en)/, "\\1_GA", 1, $(i)); \
$(i) = gensub(/(BI|CH|DE|EN|SP)/, "\\1_EA", 1, $(i))} \
print}'
1100018;Beksten;Mathis;ch_GA;EK;EN_EA;GE;;ma;mu;sf;sp;

"gensub" gibt es in GNU awk.

Tschoe!

Axel

Michael Hagedorn

unread,
Sep 16, 2022, 8:30:45 AM9/16/22
to

> Du erwartest im Ernst, mit Suchen etwas Brauchbares zu finden? Aber
> wonach soll man in deinem Fall suchen?
Na ja -- man findet schon div. Treffer, wenn man "sed search replace
column n" eintippt ... aber
ich schaue mir Deine Zeilen trotzdem gerne an - danke.

Michael Hagedorn

unread,
Sep 16, 2022, 8:46:05 AM9/16/22
to
l wieder.
>
> echo '1100018;Beksten;Mathis;ch;EK;EN;GE;;ma;mu;sf;sp;' \
> | awk 'BEGIN {FS = ";"; OFS = ";"} \
> {for (i=4; i<NF; i++) { \
> $(i) = gensub(/(bi|ch|de|en)/, "\\1_GA", 1, $(i)); \
> $(i) = gensub(/(BI|CH|DE|EN|SP)/, "\\1_EA", 1, $(i))} \
> print}'
> 1100018;Beksten;Mathis;ch_GA;EK;EN_EA;GE;;ma;mu;sf;sp;
>
> "gensub" gibt es in GNU awk.

Kannte ich auch noch nicht -- gefällt mir!
Danke!

Michael Hagedorn

unread,
Sep 16, 2022, 8:47:00 AM9/16/22
to

>
> Für mich wäre da der Punkt erreicht, wo ich zu einer richti-
> gen Programmiersprache greifen würde :-). In Python sähe das
> in der Basisversion beispielsweise so aus:
Ja, Du hast vermutlich Recht ... ich schaue mir auch den Python-Code an
sieht auf den ersten Blick tatsächlich mindestens genauso
einfach aus.
Danke!

Axel Reichert

unread,
Sep 16, 2022, 10:27:09 AM9/16/22
to
awk verzoegert fuer mich bei derlei Aufgaben den Punkt, an dem
"richtige" Programmiersprachen ranmuessen, wie Tim so schoen
schrieb. Allerdings ist mein Python nicht so elegant wie seines, daher
ist sein Lesbarkeitsargument fuer mich noch nicht so stichhaltig. Mein
Code ist je nach Zaehlung noch einzeilig und noch lesbar.

Das "gensub" braucht es nicht unbedingt, aber sonst hast eine laengliche
Liste mit Einzelersetzungen wie in deinem urspruenglichen sed-Versuch,
weil (g)sub die Rueckreferenzen ("\\1" fuer den "gemerkten" Text)
fehlen. Die haettest auch in deinem Fehlversuch verwenden koennen, siehe
Helmuts ingenieuse, aber fuer mich zu kryptische Loesung.

Gerade sehe ich, dass es

... i<=NF ...

heissen muss und

... FS = OFS = ";"

heissen kann.

Tschoe!

Axel

Axel Reichert

unread,
Sep 16, 2022, 11:00:14 AM9/16/22
to
Axel Reichert <ma...@axel-reichert.de> writes:

> Das "gensub" braucht es nicht unbedingt, aber sonst hast eine laengliche
> Liste mit Einzelersetzungen wie in deinem urspruenglichen sed-Versuch,
> weil (g)sub die Rueckreferenzen ("\\1" fuer den "gemerkten" Text)
> fehlen.

Muss die Ingrid machen, da es "&" fuer den gesamten passenden Text auch
in POSIX-awk gibt und das hier reicht:

echo '1100018;Beksten;Mathis;ch;EK;EN;GE;;ma;mu;sf;sp;' \
| awk 'BEGIN {FS = OFS = ";"} \
> {for (i=4; i<=NF; i++) { \
> sub(/(bi|ch|de|en)/, "&_GA", $(i)); \
> sub(/(BI|CH|DE|EN|SP)/, "&_EA", $(i))} \
> print}'
1100018;Beksten;Mathis;ch_GA;EK;EN_EA;GE;;ma;mu;sf;sp;

War mit 3 Versuchen also ein Eagle an einem Par-5-Loch auf dem
Code-Golfplatz. (-;

Tschoe!

Axel

Christian Garbs

unread,
Sep 16, 2022, 7:02:20 PM9/16/22
to
Mahlzeit!
Tim Landscheidt <t...@tim-landscheidt.de> wrote:

> Der wesentliche Nachteil besteht darin, dass man das
> schlecht in einen Einzeiler quetschen kann, das heißt, man
> muss, wenn man das Shell-Script „behalten“ will, zwei Datei-
> en pflegen, installieren, versionieren, etc. Aber der massiv
> sinkende Wartungsaufwand ist es IMNSHO allemal wert.

Ich wollte gerade vorschlagen, dass man das Python-Skript dem
Python-Interpreter als HERE-Document übergibt, aber dann wird das mit
der Übergabe der Datei auf STDIN nichts mehr.

Die CSV-Datei wurde eh per 'cat' reingericht, oder? Dann könnte man
den Dateinamen als Parameter übergeben und Python muss sie halt selbst
öffnen.


Wobei, iiih, so geht es ja doch mit stdin und HERE-Document:

#v+
#!/bin/sh
( echo Zeile 1; echo Zeile 2 ) | perl /dev/fd/3 3<< 'EOF' | wc -l
while (my $line = <>) {
print "$line";
print "$line";
}
EOF
#v-

wc zählt 4 Zeilen, das Perlskript verdoppelt den Output.

Also kann man mit so einem Konstrukt den Python-Code einfach mit ins
Shellscript schreiben ;-)

Wie portabel ist denn ein Dateiname wie /dev/fd/3?

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
_o o/ \o_ \ / __ __o |o \__/o | o____ _o o/
__|- |__ __/ \__/o | / | / o\ / \ |
> | > / \ /o\ o| << | << < \

Helmut Waitzmann

unread,
Sep 17, 2022, 1:50:35 PM9/17/22
to
Axel Reichert <ma...@axel-reichert.de>:

> Helmuts ingenieuse, aber fuer mich zu kryptische Loesung.
>

Sie ist nicht so kompliziert, wie sie vielleicht aussieht.  Sie
macht von mehreren Hilfsmitteln Gebrauch:

Der erweiterte reguläre Ausdruck (extended regular expression,
siehe die Option «-E» beim «sed»‐Aufruf)

^(([^;]+)(;[^;]*){2,})

passt auf alle Zeilen, die mit einem oder mehreren Zeichen, die
kein «;» sind, beginnen; danach müssen dann mindestens
zweimal (im regulären Ausdruck durch «(;[^;]*){2,}»
wiedergegeben) je ein «;» gefolgt von null oder mehr Zeichen, die
kein «;» sind, folgen.  Mit anderen Worten:  Der reguläre
Ausdruck passt auf die Zeilen, an deren Anfang mindestens 3 mit
«;» abgeteilte Elemente stehen, von denen das erste (die Nummer)
nicht leer sein darf.  (Für die Vor‐ und Nachnamen und weitere
Elemente will ich es auch zulassen, dass die leer sein dürfen).

Dann muss in derselben Zeile noch eines der Elemente «;bi;», «;ch;»,
«;de;» oder «;en;» folgen, dargestellt durch den regulären
Ausdruck

;(bi|ch|de|en);

In der Variante gibt es das ähnlich für die Elemente in
Großbuchstaben:

;(BI|CH|DE|EN|SP);


Zusammengesetzt ergibt sich


^(([^;]+)(;[^;]*){2,});(bi|ch|de|en);

bzw.

^(([^;]+)(;[^;]*){2,});(BI|CH|DE|EN|SP);


Das Ersetzungskommando


s//\1;\4_GA;/

bzw.

s//\1;\4_EA;/

bedeutet wegen «s//…/», den zuvor verwendeten regulären Ausdruck
als Ausdruck wiederzuverwenden.  Der Ersetzungsteil

\1;\4_GA;

bedeutet, in den Ersetzungstext den Textteil, der im regulären
Ausdruck vom ersten (genauer: wegen «\1» vom mit der ersten
öffnenden Klammer beginnenden) geklammerten Teilausdruck, also
vom Ausdruck

(([^;]+)(;[^;]*){2,})

erfasst worden ist, zu stecken.  Anders ausgedrückt, der
Teilausdruck wird unverändert übernommen.

Ihm folgt ein «;» und dann der vom vierten (genauer: wegen «\4»
vom mit der vierten öffnenden Klammer beginnenden) geklammerten
Teilausdruck erfasste Textteil, also vom Ausdruck «(bi|ch|de|en)»
erfasste Textteil.  Dann folgt «_GA» und schließlich noch der
abschließende «;».

Kurz:  Das Ersetzungskommando


s//\1;\4_GA;/

hängt an das erste in der Zeile von «;» eingerahmte Teilstück «bi»,
«ch», «de» oder «en» «_GA» hinten dran.

Nun kann es natürlich sein, dass in einer Zeile mehrere solcher
Teilstücke stehen, an die «_GA» angehängt werden muss.

Deshalb verwende ich die Kommandofolge


:nochmal
s/…/…/
t nochmal

Sie bedeutet, dass das Ersetzungskommando so oft wiederholt wird,
bis es nichts mehr zu ersetzen gegeben hat:  Das Kommando

t Sprungziel

bewirkt einen Sprung zum mit dem Kommando


: Sprungziel

angegebenen Sprungziel genau dann, wenn das vorangegangene
Ersetzungskommando etwas ersetzt hat.

Das erlaubt es, allen Textstücken in einer Zeile, die es nötig
haben, «_GA» anzuhängen.

Dann werden mit denselben Verfahren noch den von «;» eingerahmten
Textteilen «BI», «CH», «DE», «EN» und «SP» je ein «_EA»
angehängt.

Axel Reichert

unread,
Sep 17, 2022, 2:30:43 PM9/17/22
to
Helmut Waitzmann <nn.th...@xoxy.net> writes:

> Axel Reichert <ma...@axel-reichert.de>:
>
>> Helmuts ingenieuse, aber fuer mich zu kryptische Loesung.
>>
>
> Sie ist nicht so kompliziert, wie sie vielleicht aussieht.  Sie macht
> von mehreren Hilfsmitteln Gebrauch:
>
> Der erweiterte reguläre Ausdruck (extended regular expression, siehe
> die Option «-E» beim «sed»‐Aufruf)
>
> ^(([^;]+)(;[^;]*){2,})

... ist beim Lesen einigermassen klar gewesen, haette ich aber nicht
ohne ein halbes Dutzend Tests hinschreiben koennen.

> s//\1;\4_EA;/
>
> bedeutet wegen «s//…/», den zuvor verwendeten regulären Ausdruck als
> Ausdruck wiederzuverwenden.

Ah! Dieses Detail hatte ich nicht auf dem Schirm, danke. Der Rest ist
dann klar.

> :nochmal
> s/…/…/
> t nochmal

Spruenge in sed habe ich genauso wie den "hold buffer" noch nie
benutzt. Ich weiss nur, dass es sie gibt. Das ist fuer mich die
Demarkationslinie fuer andere Sprachen. Laeuft in "info sed" auch als
"advanced sed". (-:

Mein Fazit ist, dass meine Loesung formal gesehen am Thema vorbei war
(es wurde nach sed gefragt), aber eine Menge "Turnerei" erspart, weil
awk mit Hilfe von Spaltentrennern kurzen Prozess machen kann.

Danke fuer deine wie immer glasklaren und ausfuehrlichen Erklaerungen!
Schreibst du so eine Loesung eigentlich aus dem Stegreif runter?

Tschoe!

Axel

Helmut Waitzmann

unread,
Sep 17, 2022, 6:04:02 PM9/17/22
to
Axel Reichert <ma...@axel-reichert.de>:
> Schreibst du so eine Loesung eigentlich aus dem Stegreif runter?
>

Kommt darauf an, was man unter «aus dem Stegreif» versteht.  Ich
war mir ziemlich bald sicher, dass das mit «sed» gemacht werden
kann.  Dann habe ich mich hingesetzt und es entwickelt – nicht
ohne ins «sed»‐Manual zu schauen und mich zu vergewissern, wie
das Kommando für den bedingten Sprung heißt.

Die Technik, wie man in einem von einem regulären Ausdruck
erfassten Textteil Teile verändert und andere (mit den
«\nummer»‐Ersetzungstexten) unverändert lässt, ist mir inzwischen
geläufig.  Das gibt es ja auch in Text‐Editoren, die Suchen mit
regulären Ausdrücken und Ersetzen anbieten.

Für den Witz daran, das Anfangsstück der Zeile mit Id, Vor‐ und
Nachname unbehelligt zu lassen, bietet sich diese Technik ja an. 
Wieviele HPU‐Sekunden es gebraucht hatte, bis ich den regulären
Ausdruck dazu vorliegen hatte, weiß ich nicht mehr.  Ein paar
Minuten könnten es schon gewesen sein, um alle Feinheiten mit den
feldbegrenzenden «;» hinzubekommen.

Auch die Erkenntnis, dass die Aufgabe in zwei verschiedene
Ersetzungsoperationen eingedampft werden kann, weil zwei
verschiedene Textteile angehängt werden sollen, hat ihren Teil
der HPU‐Zeit gebraucht.

Und schließlich die Erkenntnis, dass beide Ersetzungsaufgaben
unabhängig von einander nacheinander ausgeführt werden können –
ja überhaupt, dass jede einzelne Ersetzung unabhängig von
weiteren ausgeführt werden kann –, war einen eigenen Gedanken
wert:  Es muss dabei sichergestellt sein, dass nicht durch eine
Ersetzungsoperation weiterer Text entsteht, der seinerseits durch
weitere Textersetzungsversuche nochmals bearbeitet wird.

Beispielsweise wäre die Aufgabe «Hänge an jedes Auftreten von
‹;de;› noch ein ‹de;› hinten dran» so nicht lösbar: Aus «;de;»
würde «;de;de;» und dann im nächsten Schritt aus jeder der beiden
«;de;» wieder «;de;de;» u. s. f., ohne je ans Ende zu kommen.

Ralf Damaschke

unread,
Sep 17, 2022, 6:41:46 PM9/17/22
to
Helmut Waitzmann schrieb:

> Kurz:  Das Ersetzungskommando
>
>
> s//\1;\4_GA;/
>
> hängt an das erste in der Zeile von «;» eingerahmte Teilstück «bi»,
> «ch», «de» oder «en» «_GA» hinten dran.
>
> Nun kann es natürlich sein, dass in einer Zeile mehrere solcher
> Teilstücke stehen, an die «_GA» angehängt werden muss.

Kleine Krittelei: in jedem Schritt wird jeweils das letzte passende
Teilstück in der Zeile ersetzt. Danach gehts dann den davorstehenden
an den Kragen.

Helmut Waitzmann

unread,
Sep 18, 2022, 12:21:20 PM9/18/22
to
Ralf Damaschke <rws...@gmx.de>:
Ja, danke für die Korrektur.  Jetzt, wo du es sagst, erinnere ich
mich daran, das auch schon im Handbuch gelesen zu haben.  Das
liegt daran, dass die regulären Ausdrücke

^(([^;]+)(;[^;]*){2,});(bi|ch|de|en);

und

^(([^;]+)(;[^;]*){2,});(BI|CH|DE|EN|SP);

in ihrem Teilausdruck


^(([^;]+)(;[^;]*){2,})

so viel Text erfassen, wie sie können, wenn dabei nur für den
Rest

;(BI|CH|DE|EN|SP);

noch genug übrig bleibt.  Das ist eine Eigenschaft der regulären
Ausdrücke in «sed».  (Der Fachbegriff dazu heißt «greedy»,
gierig.)

Axel Reichert

unread,
Sep 18, 2022, 12:36:44 PM9/18/22
to
Helmut Waitzmann <nn.th...@xoxy.net> writes:

> Eigenschaft der regulären Ausdrücke in «sed».  (Der Fachbegriff dazu
> heißt «greedy», gierig.)

Sowohl Emacs als auch Perl haben regex-Geschmacksrichtungen, die auch
"bescheiden" (non-greedy) sein koennen. Gibt es dergleichen auch fuer
sed oder awk?

Die Antwort lautet vermutlich "Nein" oder "Perl", aber ein pcre2-awk
macht mir den Mund schon waessrig ...

Tschoe!

Axel

Ulli Horlacher

unread,
Sep 18, 2022, 3:19:31 PM9/18/22
to
Axel Reichert <ma...@axel-reichert.de> wrote:

> Die Antwort lautet vermutlich "Nein" oder "Perl", aber ein pcre2-awk
> macht mir den Mund schon waessrig ...

https://fex.belwue.de/fstools/#pawk


--
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: http://www.tik.uni-stuttgart.de/

Helmut Waitzmann

unread,
Sep 18, 2022, 3:48:32 PM9/18/22
to
Axel Reichert <ma...@axel-reichert.de>:
> Helmut Waitzmann <nn.th...@xoxy.net> writes:
>
>> Eigenschaft der regulären Ausdrücke in «sed».  (Der Fachbegriff dazu
>> heißt «greedy», gierig.)
>
> Sowohl Emacs als auch Perl haben regex-Geschmacksrichtungen, die auch
> "bescheiden" (non-greedy) sein koennen. Gibt es dergleichen auch fuer
> sed oder awk?

Für «sed» meine ich zu wissen, dass zumindest der POSIX‐Standard
(<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html#top>)
bei «sed» nur die gierige Variante regulärer Ausdrücke kennt, und
auch für «awk» habe ich bei einem schnellen Blick in
<https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#top>
nichts anderes entdeckt.

Nur, falls sich jemand beim Nachschlagen von «sed» im
POSIX‐Standard wundert:  Die von mir verwendete Option «-E» im
«sed»‐Aufruf für extended regular expressions kennt der
POSIX‐Standard noch nicht; ich habe aber Gerüchte gelesen, dass
sie in die nächsten Fassung des POSIX‐Standards hineinkommen
wird, und, dass sie bereits in den Implementierungen zumindest
der verbreiteten Unix‐Varianten (Linux eingeschlossen) enthalten
ist.

Axel Reichert

unread,
Sep 24, 2022, 4:04:24 AM9/24/22
to
Ulli Horlacher <fram...@rus.uni-stuttgart.de> writes:

> Axel Reichert <ma...@axel-reichert.de> wrote:
>
>> Die Antwort lautet vermutlich "Nein" oder "Perl", aber ein pcre2-awk
>> macht mir den Mund schon waessrig ...
>
> https://fex.belwue.de/fstools/#pawk

Interessant, gewissermassen der duale Ansatz, Perl quasi mit
AWK-Syntax. Danke!

Axel

Ulli Horlacher

unread,
Sep 24, 2022, 4:32:50 AM9/24/22
to
Ist (vor ueber 20 Jahren) gleichzeitig entstanden mit
https://fex.belwue.de/fstools/#fpg

grep kannte damals noch keine Option -P und ich hab mich mit den
unterschiedlichen regexp Syntaxen staendig vertan.
"Aha, nichts drin" ... "MIST, wieder falsche Syntax!"

Ausserdem kann fpg jeglichen Perl Code anwenden, nicht bloss regexps.
0 new messages