Shell: Trennzeichen zwischen Großbuchstaben ersetzen

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

geimist

Benutzer
Sehr erfahren
Maintainer
Add-on Developer
Registriert
04. Jan. 2012
Beiträge
5.968
Reaktionspunkte
1.722
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 :)
 
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"?
 
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
 
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.
 
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.
 
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 ;)
 
Wie soll das gehen? Dazu müsste man den Inhalt kennen, die Zeichenketten also mit einem Lexikon vergleichen. (SWAT.. Einheit ..)
 
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:
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 :o
 
Zuletzt bearbeitet:
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
 
#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:]]*$//"
 
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
 
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