• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Sprichwörter und Redewendungen sind das Thema unseres Monatswettbewerbes. Nähere Informationen dazu gibt es natürlich auch, und zwar auf dieser Seite ---> Klick

BBEdit Replace-Script

Cassian

Cox Orange
Registriert
25.02.07
Beiträge
97
Wieder einmal möchte ich ein Script schreiben, welches mir die Arbeit stark erleichtert.
In der letzten Zeit bekomme ich Texttabellen, die kleine aber trotzdem "wichtige" Fehler enthalten.
Wie zum Beispiel doppelte Leerzeichen zwischen Wörtern, "é" welche in "e" umgewandelt werden müssen und so weiter.
Nun möchte ich ein Script schreiben, welches mir all die Arbeit abnimmt. Doch leider komm ich einfach nicht weiter.

Als Hilfe hatte ich bisher: macscripter und applescript.extracts
dabei sind Scirpts wie folgt herausgekommen, doch leider hat kein Script die erwünschte Wirkung.

Wäre nett, wenn ihr mir auf die Sprünge helfen könntet.

Code:
tell application "BBEdit"
	activate
	make new text document
	paste
	replace "\\x20\\x20" using "\\x20"
	options {search mode:grep, starting at top:true, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
end tell

Code:
tell application "BBEdit"
	activate
	make new document
	paste
	
	replace "\\x20\\x20"
	using "\\x20"
	searching in text 1 of text document "untitled text 7"
	options
			{search mode:grep, starting at top:true, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false} ¬
							
end tell
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Hallo,


Was ist das?
Benötigst Du dafür eine Software zum Lesen?

Ansonsten würde ich einfach mit "read" den Text einlesen, manipulieren und zurückschreiben.

Viele Grüße
 

Cassian

Cox Orange
Registriert
25.02.07
Beiträge
97
Eine Texttabelle ist nichts besonderes. Es ist eigentlich nur eine Spalte mit Text auf jeder Zeile. Ein kleines Beispiel (Siehe Anhang).
Dieses ist ein Screenshot aus einem Excel-File. Diese Zeilen werden einfach kopiert und in BBEdit eingefügt.
Und zwar mit dem Script:
Code:
tell application "BBEdit"
make new document
paste
end tell
Danach sollte der Text korrigiert werden. Also doppelte Leerzeichen durch ein Leerzeichen ersetzen, ein é oder è durch ein e, usw.

Momentan geht das mit der Funktion Suchen&Ersetzen dies möchte ich aber mit einem Script lösen.
Von Hand kopieren Scriptstarten und fertig. Doch so einfach ist es nicht.
Hast du eine Idee?
 

Anhänge

  • Bild 1.png
    Bild 1.png
    7,5 KB · Aufrufe: 142

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Eine Texttabelle ist nichts besonderes. Es ist eigentlich nur eine Spalte mit Text auf jeder Zeile.
Liegt die Quelle als reiner Text vor? z.B. txt oder ein "eigenes" Format?

Kopiert? Woher?

Ich würde dazu tendieren davor alles aufzubereiten.

Viele Grüße
 

Cassian

Cox Orange
Registriert
25.02.07
Beiträge
97
Also die Datei liegt jeweils als .xls vor.
Wird von Hand geöffnte und die benötigte Spalte wird manuell kopiert und gelangt so in den Zwischenspeicher und ist bereit für den Script.
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Schade, da es mit reinem Text sonst sehr trivial wäre.

Ich würde die Bereinigung im Excel vornehmen.

Code:
tell application "Microsoft Excel"
    
    repeat with i from 28 to 12000
        
        set tmp to Value of Cell x of Row y

        -- bereinige tmp

        set (Value of Cell y of Row x) to tmp as text
        
    end repeat
    
end tell


-- Suchen und Ersetzen
on ersetzenFunktion(txt, suchenText, ersetzenText)
    
    -- suchen
    set AppleScript's text item delimiters to suchenText
    set txt to every text item of txt as list
    
    -- ersetzen
    set AppleScript's text item delimiters to ersetzenText
    
    return (txt as string)
    
end ersetzenFunktion

Die doppelten Leerzeichen entfernst Du einfach mit einer Schleife, die nach " " sucht bis nichts mehr da ist.

Viele Grüße
 

Cassian

Cox Orange
Registriert
25.02.07
Beiträge
97
Dein Script klingt nicht schlecht. Doch ich denke dieses Script würde den Zweck besser erfüllen, doch leider geht der Punkt mit replace nicht.
Code:
tell application "BBEdit"
	activate
	make new document
	paste
	set search_string to "\\x20\\x20"
	set replacement to "\\x20"
	
	replace (search_string as string) using (replacement as string) options {search mode:grep, starting at top:true}
end tell

als Hilfe stand mir besonders dieses eine Script zur verfügung. Jedoch ersetzt dies ganze Linien und nicht einzelne Zeichen.

Code:
-------------------------------------
(* this just makes a sample document. *)
-------------------------------------

set sample_text to "Walking all the day, near tall towers
where falcons build their nests
Siver winged they fly,
they know the call of freedom in their breasts
Saw Black Head against the sky
with twisted rocks that run down to the sea..."

tell application "BBEdit" (* or "TextWrangler" *)
   activate
   make document with properties {text:sample_text}
end tell

delay 3 (* just some time to view the original text *)

-------------------------------------
(* script proper starts here *)
-------------------------------------

tell application "BBEdit" (* or "TextWrangler" *)
   tell document 1
       
       -------------------------------------
       
       (* replace first line that contains a search string *)
       
       set search_string to "falcons"
       set line_replacement to "So... what happened to that great line about falcons building nests?"
       
       tell (first line whose contents contains search_string)
           if exists then set contents to line_replacement
       end tell
       
       -------------------------------------
       
       (* replace every line that contains a search string *)
       
       set search_string to "all"
       set line_replacement to "No lines containing \"" & search_string & "\" allowed!"
       
       repeat with l in (lines whose contents contains search_string)
           set l's contents to line_replacement
       end repeat
       
       -------------------------------------
       
       (* replace a numbered line *)
       
       set line_number to 5
       set line_replacement to "... And where did line " & line_number & " wander off to?"
       
       tell (first line whose startLine is line_number)
           if exists then set contents to line_replacement
       end tell
       
   end tell
end tell
 

CloneOfMyself

Weigelts Zinszahler (Rotfranch)
Registriert
24.02.07
Beiträge
253
versuchs mal so:
Code:
tell application "BBEdit"
	activate
	make new document
	paste
	set srch to "  "
	set repl to " "
	replace srch using repl searching in text 1 of text document 1 options {search mode:literal, starting at top:true, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
end tell
ist allerdings in TextWrangler (dem kleinen Bruder von BBEdit entstanden (der übrigens hervorragend Scripts aufzeichnet und auch sonst ziemlich mächtig ist).
 
  • Like
Reaktionen: Cassian

Cassian

Cox Orange
Registriert
25.02.07
Beiträge
97
versuchs mal so:
Code:
tell application "BBEdit"
	activate
	make new document
	paste
	set srch to "  "
	set repl to " "
	replace srch using repl searching in text 1 of text document 1 options {search mode:literal, starting at top:true, wrap around:false, backwards:false, case sensitive:false, match words:false, extend selection:false}
end tell
ist allerdings in TextWrangler (dem kleinen Bruder von BBEdit entstanden (der übrigens hervorragend Scripts aufzeichnet und auch sonst ziemlich mächtig ist).

Super. Das Skript funktioniert. An was hat es nun gelegen? Ich bin neu bei Applescript und kann mir die Fehler nicht selbst erklären.
 

CloneOfMyself

Weigelts Zinszahler (Rotfranch)
Registriert
24.02.07
Beiträge
253
Die Grep-Suche mit \x20 funktioniert auch "zu Fuss" schon nicht. Aber warum so kompliziert, wenn man einfach ein Leerzeichen nehmen kann. ;)

Ich habe das Script einfach in TextWrangler aufgezeichnet und modifiziert.
Das ist eines der wenigen Programme, in dem die Record-Funktion wirklich ausgezeichnet funktioniert.