Applescript查找、替换和样式

Applescript查找、替换和样式,applescript,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

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

以下是我目前掌握的情况:

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

然而,这产生了一个错误,我理解为什么,但不知道如何进行造型前更换,任何帮助将不胜感激

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

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

“算法”是计算搜索字符串的偏移量,将其替换为替换字符串,并将位置保持在重复循环中。最后,将更改后的文本重新分配给
TextEdit
的文本对象,并将存储位置的样式更改为
{font:Helvetica Bold,size:24,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

TextEdit使用Cocoa脚本的标准文本套件实现,即使在最好的情况下,它也是相当naff的。如果您正在进行整词替换,则以下操作应有效:

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
同样的方法也适用于单个字符整个段落替换;只需适当地修改…查询的
每个单词。但是,在每种情况下,您都必须精确匹配一个单词/字符/段落,并将其替换为精确的一个单词/字符/段落,否则在后续的匹配过程中,您将得到有趣的错误[1],因为Cocoa脚本由愚蠢和不称职的[2]组成(例如,尝试将重复出现的单词改为两个新词,例如
“foo”
->
“boo boo”
看看我的意思)

此外,与编写更好的应用程序中的文本套件实现不同,Cocoa Scripting的文本套件无法描述文本范围(例如,
文本(字符i)到(字符j)的…
/
文本i到j的…
),因此无法告诉TextEdit匹配,例如,“狒狒”、“傻瓜”、“痰盂”中的“oo”,等。如果需要匹配任意字符范围,则必须将文本输入AppleScript,并自行计算每个匹配的开始和结束


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


[2] (
cocoascript.framework
最初是由不了解AppleScript工作原理的Cocoa开发人员设计的,此后一直由不了解AppleScript工作原理的AppleScript开发人员进行维护。事情是这样的。)

既然其他海报都指出TextEdit非常不适合此任务,请允许我做一个解释“开箱即用”建议:使用MS Word

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

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

然后,您可以编写一个AppleScript以在Word中打开每个RTF文件并运行宏,或者您可以使用master Word VBA进行所有处理。您可以采用任何一种方式进行处理,但我会选择all VBA路径,因为在我看来,它是一种比AppleScript更好的处理MS文档的语言

当然,这需要安装MS Word。我仍然在所有Mac电脑上运行MS Office 2011,暂时不打算升级到Office 2016。Word 2011运行得很好


祝您好运。

请包含确切的错误。发生错误的原因是文字字符串没有属性
大小
。您只能通过将样式属性应用于应用程序“TextEdit”的前文档的文本对象
文本来更改样式属性“
感谢您的帮助,我遇到的一个问题是,例如带破折号的单词“电子商务”会产生错误,有解决方法吗?可能没有,因为这取决于文本编辑和/或Cocoa脚本对“单词”的定义。”。即使是最聪明的软件也比不上人类的解释器,而且TE/CS还远远不够智能。您可能希望自己获得一个副本,并使用其
查找文本
命令和一个合适的正则表达式,例如
“\\be commerce\\b”
(该
\b
模式匹配单词的开头或结尾),为您提供一个匹配位置列表,然后反向循环该列表并在文本编辑中进行更改。是,使用TextWrangler。您将编写更多、更少的代码,并获得更多、更好的结果。