Applescript查找,替换和样式

时间:2016-01-05 16:49:54

标签: applescript

我一直试图让这个简单的脚本工作,它应该搜索一个字符串,在应用一些样式时替换它,例如将文本设置为粗体和红色。

这是我到目前为止所拥有的:

tell application "Finder"
    set fl to files of folder POSIX file "/Users/Sc/Desktop/app/" as alias list
end tell
repeat with f in fl
    tell application "TextEdit"

        open f


        set text of front document to replace_chars(text of front document, "a", "0000") of me
    end tell
end repeat

on replace_chars(this_text, search_string, replacement_string)
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set the size of replacement_string to 14
    set AppleScript's text item delimiters to the replacement_string

    set this_text to the item_list as string
    set AppleScript's text item delimiters to ""
    return this_text
end replace_chars

然而,这会产生错误,我理解为什么,但不知道如何在更换之前如何设计它,任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

TextEdit使用Cocoa Scripting的标准Text Suite实现,这在最好的时候非常简单。如果您正在进行全字替换,则以下内容应该有效:

tell application "TextEdit"
    set aRef to a reference to (every word of document 1 where it is "OLDWORD")
    set aRef's color to {65535, 0, 0}
    set aRef's contents to "NEWWORD"
end tell

同样的方法也适用于单字符整段替换;只需适当修改every word of...查询。但是,在每种情况下,您必须匹配一个单词/字符/段落,并将其替换为正好一个单词/字符/段落,否则您将获得热闹的关闭由于Cocoa Scripting由愚蠢和无能[2]组成,因此在后续比赛[1]中出现N错误(例如尝试将重复的单词更改为两个新单词,例如"foo" - > "boo boo"看看我的意思)

此外,与更好的书面应用程序中的Text Suite实现不同,Cocoa Scripting的Text Suite无法描述文本范围(例如text (character i) thru (character j) of... / {{1}因此,不可能告诉TextEdit匹配,比如," oo"在" baboon","傻瓜"," spitoon"等。如果您需要匹配任意字符范围,您必须将文本输入AppleScript并自己计算每场比赛的开始和结束时间。

[1]在进行多次替换时,CS的Text Suite首先计算需要更改的所有文本范围的位置,然后从第一次匹配开始执行每次替换,最后一次完成。因此,新文本与旧文本的长度的任何差异意味着它已经计算的所有剩余匹配索引不再正确,因为先前在该位置的字符现在已经向左或向右移动。为了正确地完成工作,CS应该从头到尾计算所有位置,然后从 last 开始替换它们,然后将向后替换为第一个。

[2](text i thru j of...最初是由Cocoa开发人员设计的,他们并不了解AppleScript是如何工作的,从那以后一直由AppleScript开发人员维护,他们也不了解。所以它是。)

答案 1 :(得分:1)

TextEdit不是搜索和替换样式文本的最佳工具,例如免费的TextWrangler具有更强大的技能。

无论如何,试试这个,它只影响TextEdit

中一个已打开的文档

"算法"用于计算搜索字符串的偏移量,将其替换为替换字符串,并将该位置保留在重复循环中。最后,将更改的文本重新分配给TextEdit的文本对象,并将存储位置的样式更改为{font: Helvetica Bold, size: 24 and color: red}

property searchString : "a"
property replaceString : "0000"

tell application "TextEdit"
    set completed to false
    set ranges to {}
    set theText to text of front document
    set theSize to size of text of front document
    repeat while completed is false
        tell current application to set o to offset of searchString in theText
        if o is 0 then
            set completed to true
        else
            tell theText to set newText to text 1 thru (o - 1) & replaceString & text (o + (length of searchString)) thru -1
            set end of ranges to o
            copy newText to theText
        end if
    end repeat
    set text of front document to theText
    set size of text of front document to theSize
    repeat with aRange in ranges
        tell characters aRange thru (aRange + (length of replaceString) - 1) of front document
            set size to 24
            set its color to {65535, 0, 0}
            set font to "Helvetica Bold"
        end tell
    end repeat
end tell

答案 2 :(得分:0)

由于其他海报都注意到TextEdit适用于此任务的不合适,请允许我提出“开箱即用”的建议:使用MS Word

Word中的“查找和替换”工具可以轻松处理此任务,以及更复杂的替换。

如果您有许多RTF格式的源文档,可以在Word中打开它们,进行更改,然后保存回相同(或不同)的RTF文件。创建Word VBA宏非常容易。

然后,您可以编写AppleScript以打开Word中的每个RTF文件并运行宏,或者您可以使用主Word VBA执行所有处理。你可以用任何一种方式做到这一点,但我会选择所有的VBA路线,因为IMO,它是一种比AppleScript更好的处理MS文档的语言。

当然,这需要您安装MS Word。我仍在所有Mac上运行MS Office 2011,并且暂时不打算升级到Office 2016。 Word 2011非常有效。

祝你好运。