String bereinigen
String bereinigen
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?
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?
Re: String bereinigen
So vielleicht:
Womöglich gibt's aber noch ungeschicktere Versuche...
EDIT:
Angewendet dann z.B. mit einer der drei Varianten:
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'
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"))
Re: String bereinigen
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:tobo hat geschrieben:01.11.2022 13:24:26So vielleicht:Womöglich gibt's aber noch ungeschicktere Versuche...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'
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
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.
Re: String bereinigen
Das wusst ich auch nicht, Copy & Paste aus der Wikipedia hat geholfen
Nachtrag: Ah, da ist sogar beschrieben, wie man das Zeichen eingeben kann. Das klappt hier:
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.
Re: String bereinigen
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?
Was ich aber noch vergessen hatte war ein Leerzeichen. Wie bekomme ich das da noch rein?
Re: String bereinigen
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:rannseier hat geschrieben:01.11.2022 15:02:54Was ich aber noch vergessen hatte war ein Leerzeichen. Wie bekomme ich das da noch rein?
Code: Alles auswählen
sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^ A-Za-z0-9._#,-]/_/g'
Zuletzt geändert von JTH am 01.11.2022 15:47:18, insgesamt 1-mal geändert.
Grund: Beschreibung korrigiert
Grund: Beschreibung korrigiert
Manchmal bekannt als Just (another) Terminal Hacker.
Re: String bereinigen
Nein, dass Leerzeichen soll erhalten bleiben.
Re: String bereinigen
Ö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.
Re: String bereinigen
Alternativ ist "ẞ" die Viertbelegung von "s".JTH hat geschrieben:01.11.2022 14:09:49https://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.
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.
Re: String bereinigen
Äh, man ignoriere meinen vorigen PostJTH hat geschrieben: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?
Jo, das musste ergänzt werden. In der Form, wie ichs oben getan hab. Nur meine Beschreibung war Unfug.
Damit bleibt das Leerzeichen natürlich erhalten und wird gerade nicht durch den Unterstrich ersetzt..JTH hat geschrieben:01.11.2022 15:29:54Code: Alles auswählen
sed -E 's/([äöü])/\1e/gi;y/ÄÖÜäöü/AOUaou/;s/ß/ss/g;s/[^ A-Za-z0-9._#,-]/_/g'
Stimmt, da hast du recht. Das würd die Aufgabenstellung aber ja deutlich erweitern.hikaru hat geschrieben:01.11.2022 15:43:27Beim Ersetzen von ẞ, bzw. eigentlich generell großen Umlauten müsste man aber eigentlich kontextsensitiv vorgehen, […]
Manchmal bekannt als Just (another) Terminal Hacker.
- MegaV0lt
- Beiträge: 173
- Registriert: 21.11.2011 11:16:07
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: String bereinigen
Ich würde so was in der Art ohne externe Programme versuchen:
Umlaute müssten vorher ersetzt werden
Code: Alles auswählen
echo "${unsauber//[^a-zA-Z0-9]/_}"
bl___
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.
- schorsch_76
- Beiträge: 2601
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: String bereinigen
Willkommen in der Unicodehölle
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
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
Re: String bereinigen
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!