ubuntuusers.de

String zerlegen bzw. Leerzeichen zwischen Zeichen einfügen

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

promethux

Avatar von promethux

Anmeldungsdatum:
24. Oktober 2009

Beiträge: 164

Salut Leute.

Kennt jemand eine Möglichkeit ein String in einzelne Buchstaben zu zerlegen oder besser noch Leerzeichen hinzuzufügen?

Bsp.

Hallo  ->  H a l l o

danke euch.

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Wohnort: Im kühlen Norden

echo Hallo | sed 's/./& /g;s/ $//'

promethux

(Themenstarter)
Avatar von promethux

Anmeldungsdatum:
24. Oktober 2009

Beiträge: 164

Hut ab. 👍

Danke vielmals.

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Wohnort: Im kühlen Norden

Hier ist noch einer:

echo Hallo|awk -F, '{n=split($1,a,""); for (i=1;i<=n;i++) {printf("%s ",a[i])}}'

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

Brauche es für mein Baustelle/xsane2speech-Skript noch etwas genauer. Der Sprachsynthesizer Festival steigt bei deutschen Stimmen bei bestimmten Zeichenkombinationen aus; es sind Strings, in denen zwei Buchstaben direkt mit einer Ziffer kombiniert sind; also z.B, TZ5 oder kf7, die ich in TZ 5 oder kf 7 zerlegen müsste. Es sollte sowohl Groß- als auch Kleinbuchstaben-Zahlkombinationen so zerlegen können.

Außerdem auch noch etwas, das so etwas wie ÖkoCheck in Öko Check (oder Ökocheck) umwandeln kann, weil ansonsten so ein Wort buchstabiert wird, was natürlich für eine Sprachausgabe nicht so prickelnd ist...

sed sollte sowas können. oder? Leider verstehe ich zuwenig davon...

so long
hank

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7735

So?

1
2
echo Irgendein Text mit tz5 kf7 ÖkoCheck drin. | sed -r -e 's/[-0-9]+/ &/g' -e 's/[A-Z]/ &/g'
 Irgendein  Text mit tz 5 kf 7 Öko Check drin.

Oder so? (Weniger Leerzeichenmüll)

1
2
echo Irgendein Text mit TZ5 kf7 ÖkoCheck drin. | sed -r -e 's/([a-zA-Z]+)([-0-9]+)/\1 \2/g' -e 's/([a-z]+)([A-Z][a-z]+)/\1 \2/g'
Irgendein Text mit TZ 5 kf 7 Öko Check drin.

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

Cool, 😎 und so fix das ganze! 👍

den zweiten Vorschlag um ([a-zA-Z]+) erweitert führt dazu, dass nur mindestens doppelte Zeichen-Zahl-Kombination ersetzt wird.

sed -r -e 's/([a-zA-Z]+)([a-zA-Z]+)([-0-9]+)/\1 \2/g' -e 's/([a-z]+)([A-Z][a-z]+)/\1 \2/g'

Wie bekomme ich es jetzt noch hin, dass KreditKartenLeserFehler am besten gleich in Kredit-Karten-Lese-Fehler umgebaut wird? So wird nur das erste Vorkommen kleinGroß gefunden aber nicht kleinGroßGroß, und die Bindestriche wären standardsprachlich besser... Noch besser eigentlich Kreditkartenlesefehler...

so long
hank

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7735

Vielleicht besser so:

$ echo KreditKartenLeserFehler | sed -r -e 's/([[:lower:]])([[:upper:]])/\1-\2/g'
Kredit-Karten-Leser-Fehler

Oder so:

$ echo KreditKartenLeserFehler | sed -r -e 's/([[:lower:]])([[:upper:]])/\1\l\2/g'
Kreditkartenleserfehler

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

Schon sehr gut, allerdings wird jetzt ein vorhandener String Kauf-Rausch in Kauf -Rausch zerlegt.. Geht das vieleicht auch, die Großbuchstaben im Wort in kleine umzuwandeln? 😇

so long
hank

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

Die Zweite Version geht 👍 . Kann man aber bei dem Zerlegen von BuchstabeBuchstabeZahl verhindern dass Karten-Leser in Karten -Leser zerlegt wird? Eigentlich solle das dort doch bei Ziffern eine Leerstelle geben? 😲

so long
hank

EDIT Mein Fehler, da war ein Bindestrich vor die Null geraten...sorry

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7735

Kommt davon, wenn man -123 matchen will und die faule Variante wählt.

Ersetz den Zahlmatch durch (-?[0-9]+). Dann bleibt Kauf-Rausch Kauf-Rausch ohne Leerzeichen.

Oder noch besser lass das -? ganz weg und mach nur ([0-9]+), das Vorzeichen macht da wohl eh keinen Sinn. ☺

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

Danke, so hatte ich es jetzt versucht, und es ging - Minuszahlen kommen hoffentlich in solch einem Zusammenhang nicht vor... Kann der Synthesizer zumindest wohl nicht lesen, müsste ich aber mal ausprobieren..

Allerdings funktioniert jetzt mein recode-Befehl nicht mehr, sehr seltsam das... Scheint aber daran zu liegen, dass ich versuche, schon mal codierte Dateien nochmal aufzurufen 😬

so long
hnak

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi hank, hi frostschutz,

gibt es eigentlich irgend einen Grund, warum Ihr beim matchen der ...x1..- Kombination das "+" verwendet ?

Eigentlich kann es doch egal sein, was vor dem Buchstaben und nach der Zahl kommt, und da könnte man doch besser auf genau 1 Buchstaben und 1 Zahl matchen:

sed -r -e 's/([[:alpha:]])(-?[0-9])/\1 \2/g'

... nach dem Motto "keep it simple". Und diese Version funktioniert sogar bei Umlauten.

Der Filter für die Großbuchstaben im Wort von frostschutz oben ist sowieso schon perfekt, also wäre es zusammen:

sed -r -e 's/([[:alpha:]])(-?[0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'

LG,

track

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11314

Wohnort: Bremen

Hi!

track schrieb:

gibt es eigentlich irgend einen Grund, warum Ihr beim matchen der ...x1..- Kombination das "+" verwendet ?

Mich darst du das nicht fargen, ich hab' nur seeeehr begrenzt Ahnung davon 😉

Eigentlich kann es doch egal sein, was vor dem Buchstaben und nach der Zahl kommt, und da könnte man doch besser auf genau 1 Buchstaben und 1 Zahl matchen:

sed -r -e 's/([[:alpha:]])(-?[0-9])/\1 \2/g'

... nach dem Motto "keep it simple". Und diese Version funktioniert sogar bei Umlauten.

Hintergrund ist, dass der SprachSynthesizer bei einem Buchstaben in Kombination mit einer Zahl keine Probleme hat, es sind nur (und auch längst nicht bei allen allen) Kombinationen von zwei Buchstaben mit einer direkt nachfolgenden Zahl, die Probeme machen, daher wollte ich auch nur solche raushaben. Das "Minus"-Zeichen brauche ich dafür eigentlich nicht, direkt angebundenen "-" werden sowieso nicht ausgesprochen...

Der Filter für die Großbuchstaben im Wort von frostschutz oben ist sowieso schon perfekt, also wäre es zusammen:

sed -r -e 's/([[:alpha:]])(-?[0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'

Umlaute hab' ich in diesem Zusammenhang noch gar nicht getestet, mach ich gleich nochmal... Ich versuchs mal mit

sed -r -e 's/([[:alpha:]])([[:alpha:]])([0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'

wobei die "Einsparung" dann auch nicht allzugroß ist 😉

Trotzdem Danke -

so long
hank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na ja, "Einsparung" ist hier egal ...

Mein Ansatz war, soweit wie möglich "false positives" zu verhindern. Und je einfacher der Filter, desto weniger Fehler. So ungefähr ...

Bei den Zahlen ist ein Leerzeichen zu viel (vor der Zahl) eigentlich egal, deshalb bin ich da nicht drauf eingestiegen.
Und das Minus habe ich mitgenommen, damit er im Zweifel negative Zahlen auch als "Minus 22" ausspricht. - Nur so auf Verdacht.

Aber die Fein-Anpassung kriegst Du doch sowieso hin, trotz angeblich "keine Ahnung" .. 😉

LG,

track

Antworten |