Shell: Trennzeichen zwischen Großbuchstaben ersetzen

Status
Für weitere Antworten geschlossen.

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Tacho,

für mein synOTR muss ich Zeichenfolgen ändern, die aus Großbuchstaben bestehen und jeweils durch ein Zeichen (Leerzeichen, bzw. Unterstrich) getrennt sind.

z.B. möchte ich aus "Ein Filmname mit S W A T " zu "Ein Filmname mit SWAT" ändern.
Großbuchstaben, die Teil eines Wortes sind, sollen nicht zusammengefasst werden. zB.: "The A Team"

Das geht ja mit sed und einer passende Regular expression bestimmt, aber die sind mir irgendwie ein Buch mit sieben Siegeln …

Vielen Dank schonmal für's Gedanken machen :)
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.849
Punkte für Reaktionen
1.145
Punkte
754
Willst Du damit sagen, dass nur große Einzelbuchstaben zusammengefasst werden sollen? Also "S W A T Einheit" zu "SWAT Einheit" und nicht zu "SWATEinheit"?
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.141
Punkte für Reaktionen
1.112
Punkte
314
Zugegeben, reguläre Ausdrücke hat für mich etwas mit Hererei und schwarzer Magie zu tun und mir erschließt sich dieses Teufelswerkzeug auch nicht wirklich. Aber es ja gibt zum Glück die gute alte Suchmaschine und die spukte mir als erstes Ergebnis das hier aus...

http://www.linuxforen.de/forums/showthread.php?268130-Mit-sed-Leerzeichen-l%F6schen

Klingt erstmal nach dem was du suchst, jedoch kann ich nicht sagen ob das auch funktioniert.

Tommes
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Das geht zwar in die richtige Richtung, löscht aber für in meinem Input sämtliche Leerzeichen. Ich kann es auch nicht wirklich für mich abwandeln.
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
test="Go A Team, go A Team go"
echo $test | sed -e "s@\([A-Z]\) \([A-Z]\)@\1\2@g"
--> Go ATeam, go ATeam go

Das musst du aber mehrfach laufen lassen, am besten in einer Schleife. Wahrscheinlich ist awk daher besser geeignet als sed.
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Vielen Dank hvkls, aber es soll ja gerade nicht Großbuchstaben verbinden, die zu ganzen Wörtern gehören, sondern nur alleinstehende Großbuchstaben.
Um das passende Beispiel von dil88 aufzugreifen:
"S W A T Einheit" zu "SWAT Einheit" und nicht zu "SWATEinheit"

Ich nehme auch gerne awk ;)
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Wie soll das gehen? Dazu müsste man den Inhalt kennen, die Zeichenketten also mit einem Lexikon vergleichen. (SWAT.. Einheit ..)
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
So vielleicht:

test="S W A T Einheit Go G O go go go"
echo $test | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g"

Wenn Großklein, setze immer 123456789 davor;
Wenn Groß Leerzeichen klein, ersetze Leerzeichen durch 123456789;
Entferne alle Leerzeichen nach Großbuchstaben;
Ersetze alle 123456789 durch Leerzeichen;
Ersetze alle doppelten Leerzeichen durch je ein einziges;
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Das sieht sehr interessant aus :cool:
Aber irgendetwas stimmt da noch nicht. Auf der DS arbeiten die sed-Kommandos nicht so, wie von dir beschrieben. Wie ich jetzt aber festgestellt habe, passt es auf dem Mac (hilft mir aber nicht weiter) :confused:
Man sollte ja meinen, dass sed überall gleich arbeitet.
Rich (BBCode):
MAC-MacBookPro-Stephan:~ geimist$ echo "S W A T Einheit Go go go"  | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g"
SWAT Einheit Go go go
MAC-MacBookPro-Stephan:~ geimist$ echo "S W A T Einheit Go go go"  | sed -e "s@\([A-Z]\) @\1@g"
SWATEinheit Go go go
…
admin@DS:~$ echo "S W A T Einheit Go go go"  | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g"
S WA T Ei nh eit Go go go
admin@DS:~$ echo "S W A T Einheit Go go go"  | sed -e "s@\([A-Z]\) @\1@g"
SWATEinheitGogogo

Wie gesagt: das Ergebnis zählt. Wenn es mit awk besser geht - ich bin für alle Vorschläge offen :eek:
 
Zuletzt bearbeitet:

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
29.849
Punkte für Reaktionen
1.145
Punkte
754
Auf meiner DS hat der Vorschlag aus Beitrag #10 funktioniert. Liefert wie ein Standard-Linux folgenden Output:

Rich (BBCode):
SWAT Einheit Go GO go go go

Die erste Zeile aus Beitrag #11 funktionieren auch bei mir nicht und liefert hier den Output

Rich (BBCode):
SWAT E inheit G o go go
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
#10 funktioniert bei mir auf der DS (5.1). Man muss nur noch eventuelle Leerzeichen am Ende abfangen.

test="Go Go GO go S W A T Einheit Go G O go go go "
echo $test | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g ; s@^[[:space:]]\{1,\}@@ ; s/[[:space:]]*$//"
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Es ist nach wie vor so bei mir (auch mit #13). Auf meinen DSen geht es nicht, aber auf dem MAC.
Ich weiß nicht, wo da der Hase im Pfeffer liegt …

Rich (BBCode):
admin@DS:~$ test="Go Go GO go S W A T Einheit Go G O go go go "
admin@DS:~$ echo $test | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g ; s@^[[:space:]]\{1,\}@@ ; s/[[:space:]]*$//"
Go Go GO go SW AT Ei nh eit Go GO go go go
…
MAC-MacBookPro-Stephan:~ geimist$ test="Go Go GO go S W A T Einheit Go G O go go go "
MAC-MacBookPro-Stephan:~ geimist$ echo $test | sed -e "s@\([A-Z][a-z]\)@123456789\1@g ; s@\([A-Z]\) \([a-z]\)@\1123456789\2@g ; s@\([A-Z]\) @\1@g ; s@123456789@ @g ; s@[[:space:]]\{1,\}@ @g ; s@^[[:space:]]\{1,\}@@ ; s/[[:space:]]*$//"
Go Go GO go SWAT Einheit Go GO go go go
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Es liegt dann an den Einstellungen des Terminals beim Copy & Paste. Der Code aus deinem DS-Beispiel #14 liefert bei mir auf der DS (und dem Mac) das gleiche erwünschte Ergebnis wie der Mac-Code #14.
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat