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.