String bereinigen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rannseier
Beiträge: 57
Registriert: 24.09.2007 12:37:30

String bereinigen

Beitrag von rannseier » 01.11.2022 12:39:16

Hallo zusammen,

In einem Bashscript habe ich verschiedene Strings, die bereinigt werden müssen.

Letztendlichen sollen nur übrig bleiben:
- Großbuchstaben A-Z
- Kleinbuchstaben a-z
- Ziffern 0-9
- Umlaute ÄÜÖäüöß (Idealerweise ersetzt durch Ae, Ue, Oe, ae, ue, oe, ss)
- Punkt .
- Bindestrich -
- Unterstrich _
- Raute #
- Komma ,

Alle andere soll durch ein Unterstrich ersetzt werden.

Beispiel:
unsauber="blä§$"
sauber=xyz($unsauber)
echo $sauber
blae__

Wie macht man das am ungeschicktesten?

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

Re: String bereinigen

Beitrag von tobo » 01.11.2022 13:24:26

So vielleicht:

Code: Alles auswählen

sed 's/Ü/Ue/g;s/Ä/Ae/g;s/Ö/Oe/g;s/ü/ue/g;s/ä/ae/g;s/ö/oe/g;s/ß/ss/g;s/[^A-Za-z0-9._#,-]/_/g'
Womöglich gibt's aber noch ungeschicktere Versuche...

EDIT:
Angewendet dann z.B. mit einer der drei Varianten:

Code: Alles auswählen

sauber=$(echo "$unsauber" | sed '...')
sauber=$(sed '...' <<<"$unsauber")
sauber=$(sed '...' <(echo "$unsauber"))

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

Re: String bereinigen

Beitrag von JTH » 01.11.2022 13:42:39

tobo hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 13:24:26
So vielleicht:

Code: Alles auswählen

sed 's/Ü/Ue/g;s/Ä/Ae/g;s/Ö/Oe/g;s/ü/ue/g;s/ä/ae/g;s/ö/oe/g;s/ß/ss/g;s/[^A-Za-z0-9._#,-]/_/g'
Womöglich gibt's aber noch ungeschicktere Versuche...
Was großartig anderes fällt mir da spontan auch nicht ein. Man könnt es höchstens ein klein wenig abkürzen, indem man erst ein „e“ hinter allen Umlauten ergänzt und dann y/…/…/ benutzt:

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^A-Za-z0-9._#,-]/_/g' <<<"$dirty_str"

Und wenn man das große ß – das – auch beachten möchte :mrgreen:

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;s/([ẞß])/\1s/g;y/ÄÖÜäöüẞß/AOUaouSs/;s/[^A-Za-z0-9._#,-]/_/g' <<<"$dirty_str"
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: String bereinigen

Beitrag von tobo » 01.11.2022 14:05:06

JTH hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 13:42:39
Und wenn man das große ß – das – auch beachten möchte
Da hatte ich sogar kurz dran gedacht - konnte mich allerdings nicht daran erinnern, wie ich es erzeugen kann...

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

Re: String bereinigen

Beitrag von JTH » 01.11.2022 14:09:49

Das wusst ich auch nicht, Copy & Paste aus der Wikipedia hat geholfen :lol:

Nachtrag: Ah, da ist sogar beschrieben, wie man das Zeichen eingeben kann. Das klappt hier:
https://de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F#Tastaturbelegung_T1 hat geschrieben: Bei neueren Versionen der deutschen Standardtastenbelegung von X11, die von den meisten Linux-Distributionen und anderen unixoiden Systemen genutzt wird, ist die Feststelltaste (⇩) zu aktivieren und danach wird auf die ß-Taste gedrückt.
Manchmal bekannt als Just (another) Terminal Hacker.

rannseier
Beiträge: 57
Registriert: 24.09.2007 12:37:30

Re: String bereinigen

Beitrag von rannseier » 01.11.2022 15:02:54

Soviele Sonderzeichen wie ein großes ß brauch ich gar nicht. Führt eh nur bei unterschiedlichen Betriebssystemen zu Problemen.

Was ich aber noch vergessen hatte war ein Leerzeichen. Wie bekomme ich das da noch rein?

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

Re: String bereinigen

Beitrag von JTH » 01.11.2022 15:29:54

rannseier hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:02:54
Was ich aber noch vergessen hatte war ein Leerzeichen. Wie bekomme ich das da noch rein?
Soll auch durch den Unterstrich ersetzt werden? Edit: Das soll erhalten bleiben? Dann kannst du’s einfach in der Character-Liste [^A-Za-z0-9._#,-] am Ende ergänzen:

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^ A-Za-z0-9._#,-]/_/g'
Das einzelne Minus/der Bindestrich muss dort allerdings als letztes drin stehen.
Zuletzt geändert von JTH am 01.11.2022 15:47:18, insgesamt 1-mal geändert.
Grund: Beschreibung korrigiert
Manchmal bekannt als Just (another) Terminal Hacker.

rannseier
Beiträge: 57
Registriert: 24.09.2007 12:37:30

Re: String bereinigen

Beitrag von rannseier » 01.11.2022 15:36:08

Nein, dass Leerzeichen soll erhalten bleiben.

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

Re: String bereinigen

Beitrag von JTH » 01.11.2022 15:40:54

Öhm, tja, hast du denn die vorherige Variante überhaupt mal ausprobiert? Was hier zum Beispiel (beachte die Leerzeichen) herauskommt?

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^A-Za-z0-9._#,-]/_/g' <<<"Diäs ißt 1nä pöse, pöße #Züchenkettä...!"
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: String bereinigen

Beitrag von hikaru » 01.11.2022 15:43:27

JTH hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 14:09:49
https://de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F#Tastaturbelegung_T1 hat geschrieben: Bei neueren Versionen der deutschen Standardtastenbelegung von X11, die von den meisten Linux-Distributionen und anderen unixoiden Systemen genutzt wird, ist die Feststelltaste (⇩) zu aktivieren und danach wird auf die ß-Taste gedrückt.
Alternativ ist "ẞ" die Viertbelegung von "s".

Beim Ersetzen von ẞ, bzw. eigentlich generell großen Umlauten müsste man aber eigentlich kontextsensitiv vorgehen, denn gerade ẞ dürfte in erster Linie in Majuskelschriften benutzt werden, was zu unerwarteten Ergebnissen führt, wenn man den Kontext ignoriert:

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;s/([ẞß])/\1s/g;y/ÄÖÜäöüẞß/AOUaouSs/;s/[^A-Za-z0-9._#,-]/_/g' <<<"ICH VERSPRACH MEINEN ELTERN, DAẞ WIR IN MAẞEN TRÄNKEN."
ICH_VERSPRACH_MEINEN_ELTERN,_DASs_WIR_IN_MASsEN_TRAeNKEN.
:mrgreen:

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

Re: String bereinigen

Beitrag von JTH » 01.11.2022 15:45:16

JTH hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:40:54
Öhm, tja, hast du denn die vorherige Variante überhaupt mal ausprobiert? Was hier zum Beispiel (beachte die Leerzeichen) herauskommt?
Äh, man ignoriere meinen vorigen Post :?

rannseier hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:36:08
Nein, das Leerzeichen soll erhalten bleiben.
Jo, das musste ergänzt werden. In der Form, wie ichs oben getan hab. Nur meine Beschreibung war Unfug.
JTH hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:29:54

Code: Alles auswählen

sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^ A-Za-z0-9._#,-]/_/g'
Damit bleibt das Leerzeichen natürlich erhalten und wird gerade nicht durch den Unterstrich ersetzt..

hikaru hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:43:27
Beim Ersetzen von ẞ, bzw. eigentlich generell großen Umlauten müsste man aber eigentlich kontextsensitiv vorgehen, […]
Stimmt, da hast du recht. Das würd die Aufgabenstellung aber ja deutlich erweitern.

hikaru hat geschrieben: ↑ zum Beitrag ↑
01.11.2022 15:43:27
:mrgreen:
:lol: :THX:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: String bereinigen

Beitrag von MegaV0lt » 02.11.2022 08:03:37

Ich würde so was in der Art ohne externe Programme versuchen:

Code: Alles auswählen

echo "${unsauber//[^a-zA-Z0-9]/_}"
bl___
Umlaute müssten vorher ersetzt werden
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.

Benutzeravatar
schorsch_76
Beiträge: 2542
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: String bereinigen

Beitrag von schorsch_76 » 02.11.2022 08:37:00

Willkommen in der Unicodehölle :mrgreen:

Leider ist es so das unter UTF-8 ein Codepoint mehr als ein Byte haben kann und auch die Konvertierungen tolower()/toupper() nicht immer reversiebel sind. Das macht es schwer bei deinen "Unsaubereren" Strings den Teil zu erkennen welcher wirklich gewünscht ist.

[1] http://icu-project.org/docs/papers/icu_ ... _iuc26.ppt
[2] https://de.wikipedia.org/wiki/Unicode
[3] https://de.wikipedia.org/wiki/Codepoint
[4] http://icu-project.org/docs/papers/icu_ ... _iuc19.ppt

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: String bereinigen

Beitrag von Meillo » 02.11.2022 10:33:58

Ich sehe das nicht so schlimm: Es wird ein Versuch unternommen, Umlaute in Ersatzdarstellungen zu konvertieren und danach wirft man alles weg, was nicht einem kleinen ASCII-Subset entspricht. Das ist doch robust, wenn man nur zuverlaessige nicht aber perfekte Resultate braucht.
Use ed once in a while!

Antworten