AppleScript-Beispiele

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
pete schrieb:
Was ich auch oft brauche, ist die Möglichkeit, schnell einige Zeichen in einem String zu ändern.

Hierfür bietet AppleScript von Haus aus mit "text item delimiter" und "text items" eine blitzschnelle Methode, abgebildet in der Funktion replace.

Als praktisches Anwendungsbeispiel ersetzt die Funktion trim alle mehrfach hintereinander folgenden Vorkommen von Leerzeichen in einem String, und löscht alle vor und hinter dem String befindliche Leerzeichen.

Hi pete,

cool - aber wie Du schon bei 'sort' gemerkt hast, lohnt es sich oft, bei den Shell-Befehlen nachzuschauen. Auch dafür gibt's was Praktisches in der Shell: 'sed' - lies dich mal in die man-Page ein. Das löst Aufgaben wie diese mit' nem Einzeiler ;)

für die erste Aufgabe:

sed 's|A|B|g' (wobei in diesem Beispiel alle As durch Bs ersetzt werden - geht natürlich auch mit anderen Zeichen oder Strings bzw. mit Regular Expressions)

und für die zweite Aufgabe:

sed 's|^[\ ]*||' löscht die Leerzeichen vor ...
und
sed 's|[\ ]*$||' nach dem String
und
sed 's|\ [\ ]*|\ |g'* ersetzt alle Mehrfach-Leerzeichen durch ein einzelnes.

Wie Du das in ein AppleScript einbaust, weisst Du ja ...

*(eigentlich sollte das auch mit sed 's|[\ ]+|\ |g' gehen, hat aber bei mir nicht fuktioniert - weiss jemand, warum?)

Andere Shell-Befehle, die ich für ähnliche Zwecke empfehlen könnte, wären z.B. 'grep' oder 'awk' - schau einfach mal in die man-Page ...


Grüße,

Daisy
 
  • Like
Reaktionen: stk

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Daisy schrieb:
Hi pete,

cool - aber wie Du schon bei 'sort' gemerkt hast, lohnt es sich oft, bei den Shell-Befehlen nachzuschauen. Auch dafür gibt's was Praktisches in der Shell: 'sed' - lies dich mal in die man-Page ein. Das löst Aufgaben wie diese mit' nem Einzeiler ;)
Und wenn man schon dabei ist... Warum nicht gleich, statt 2 Kommandos (sed und awk) zu lernen, nur eines: perl...

Daisy schrieb:
für die erste Aufgabe:

sed 's|A|B|g' (wobei in diesem Beispiel alle As durch Bs ersetzt werden - geht natürlich auch mit anderen Zeichen oder Strings bzw. mit Regular Expressions)
Code:
perl -pe 's/A/B/g'
oder auch
Code:
perl -pe 'tr/A/B/'

Daisy schrieb:
und für die zweite Aufgabe:

sed 's|^[\ ]*||' löscht die Leerzeichen vor ...
und
sed 's|[\ ]*$||' nach dem String
und
sed 's|\ [\ ]*|\ |g'* ersetzt alle Mehrfach-Leerzeichen durch ein einzelnes.
Code:
perl -pe 's/^ +//'
Code:
perl -pe 's/ +$//'
Code:
perl -pe 's/  +/ /g'
und alles zusammen
Code:
perl -pe 's/^ +//; s/ +$//; s/  +/ /g';

Ich empfehle immer perl anstelle sed/awk, weil Du damit dasselbe machen kannst, und noch deutlich mehr. Die Komplexität des Erlernens ist - finde ich - gleich, die Mächtigkeit perls aber ungleich höher.
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
pete schrieb:
Das macht ein Script allerdings auch langsamer, wenn es sehr häufig verwendet wird!

Moin,

du bist ja sooo fleissig - schöne neue Routine, vielen Dank!
Vielleicht könnte man das Problem der allzu häufigen (und teilweise unnötigen) Aufrufe umgehen, indem du das davor setzt:

Code:
to getRange(thisList, startVal, endVal)
	try
		return (items startVal thru endVal of thisList)
	on error
		return (items itemNr(thisList, startVal) thru itemNr(thisList, endVal) of thisList)
	end try
end getRange

set thisList to {"BMW", "Mercedes", "Ford", "Opel"}
getRange(thisList, 2, -1) -- ruft deine Routine nicht auf
getRange(thisList,-33,588) -- ruft sie auf

Grüße,

Daisy
 

Daisy

Uelzener Rambour
Registriert
14.01.06
Beiträge
366
Bekommst mal wieder ein großes Lob für deine schönen Beispiele, pete :)

schade eigentlich, dass Apple bei Boolean-Variablen nicht eine automatische Umwandlung in number oder integer ermöglicht hat:

set boolVal to true
get 4711 * boolVal

wäre ja doch eigentlich eine logische Fortführung der Applescript-typischen laxen Handhabung von Coercions, oder?

(Vielleicht sollte man das mal anregen ...?)


Grüße,

D.