使用AppleScript查找和替换文本文件

时间:2014-03-10 11:55:55

标签: file text replace find applescript

我正在尝试编写一个将通过启动代理程序运行的AppleScript。脚本需要做的是编辑用户首选项plist文件,以便默认保存位置特定于该用户。我知道这可以通过将“〜/ documents”设置为模板plist中的位置来完成。但是Premier Pro还需要将暂存文件写入本地驱动器。为简单起见,我希望每个用户根据用户名将这些放入位置。只有在首次登录时才从模板创建本地配置文件时,才需要运行此脚本。

我已经开始使用本网站上的一些示例代码,并在下面进行简单的测试。此测试应编辑txt文件并将一个单词替换为另一个单词。此脚本目前无法使用。测试时,它会在TextEdit中打开test.txt,但不会执行任何操作。也没有显示错误。

提前谢谢

约翰。

replaceText("replace this", "replace with this", "/Volumes/USB_Drive/test.txt")


on replaceText(search_string, replacement_text, this_document)
tell application "TextEdit"
    open this_document
    set AppleScript's text item delimiters to the search_string
    set this_text to the text of the front document as list
    set AppleScript's text item delimiters to the replacement_text
    set the text of the front document to (this_text as string)
    close this_document saving yes
end tell
end replaceText

3 个答案:

答案 0 :(得分:4)

这是一个不需要文本编辑的版本。它将以utf-8编码读取文件,更新其内容并将其作为utf-8编码文本存储回文件中。我在编写文件时使用try块的原因是,如果另一个应用程序同时打开了具有读取权限的文件,则会出现错误。如果您想要搜索并替换区分大小写,则可以将 set ti包含在内容的每个文本项周围。更换字符串时无需激活它,仅用于查找字符串。

set stringToFind to "replace that"
set stringToReplace to "with this"
set theFile to choose file
set theContent to read theFile as «class utf8»
set {oldTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, stringToFind}
set ti to every text item of theContent
set AppleScript's text item delimiters to stringToReplace
set newContent to ti as string
set AppleScript's text item delimiters to oldTID
try
    set fd to open for access theFile with write permission
    set eof of fd to 0
    write newContent to fd as «class utf8»
    close access fd
on error
    close access theFile
end try

答案 1 :(得分:2)

嗯,是的,正如@dj_bazzie_wazzie指出的那样,你真的不需要文本编辑器,你可以使用终端并做类似的事情:

perl -pi -e 's/old text/new text/g' /path/to/theFile.plist

当然,您可以在AppleScript中使用强大的do shell script命令:

do shell script "perl -pi -e 's/" & search_string & "/" & replacement_text & "/g' " & quoted form of (POSIX path of file_path)

- 假设file_path是一个带有Mac风格(冒号分隔)文件路径的变量。

答案 2 :(得分:0)

http://discussions.apple.com/message/20542594#20542594修改,下面的处理程序可以执行您想要的操作。我做了一些更改并添加了变量。一些注意事项:(1)处理程序调用之前的'my'确保它被视为脚本的处理程序而不是TextEdit应该解释'内部'(因为它在tell块中); (2)'考虑案例'使得处理程序区分大小写,我认为你想要; (3)您可能会考虑类似TextWrangler,它具有强大且功能丰富的AppleScript支持,并在其AS字典中包含文本替换,Smile也是一个非常棒的脚本编辑器(可以处理文本,并且可以很好地格式化plist文件)

tell application "TextEdit"
    set workingWin to open this_document
    set this_text to the text of the workingWin
    set the text of the workingWin to (my replaceText(this_text, search_string, replacement_text))
    close workingWin saving yes
end tell

to replaceText(someText, oldItem, newItem)
    (*
         replace all occurances of oldItem with newItem
              parameters -     someText [text]: the text containing the item(s) to change
                        oldItem [text, list of text]: the item to be replaced
                        newItem [text]: the item to replace with
              returns [text]:     the text with the item(s) replaced
         *)
    considering case
        set {tempTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, oldItem}
        try
            set {itemList, AppleScript's text item delimiters} to {text items of someText, newItem}
            set {someText, AppleScript's text item delimiters} to {itemList as text, tempTID}
        on error errorMessage number errorNumber -- oops
            set AppleScript's text item delimiters to tempTID
            error errorMessage number errorNumber -- pass it on
        end try
    end considering
    return someText
end replaceText