AppleScript中使用sed执行正则表达式遇问题求助
AppleScript调用sed实现文本清理的解决方法
一、先修复孤立标点正则的语法问题
sed默认使用基本正则表达式(BRE),如果你的正则用了扩展语法(如+、?、()分组等),必须给sed加-E参数(macOS系统sed用-E,GNU sed用-r),否则会因为语法解析失败导致脚本崩溃。
比如处理孤立冒号/分号的正确正则写法:
- 匹配前后非字母数字的冒号并移除:
s/([^a-zA-Z0-9]):([^a-zA-Z0-9])/\1\2/g - 匹配前后非字母数字的分号并移除:
s/([^a-zA-Z0-9]);([^a-zA-Z0-9])/\1\2/g
如果用扩展正则,要确保sed命令带-E参数,不用注释掉这两个正则,直接修正语法即可。
二、确保TextEdit文本正确传递
AppleScript获取和传递TextEdit文本时,必须处理特殊字符(引号、换行等),否则会导致shell命令解析异常,出现"无报错但无效果"的情况。正确写法如下:
tell application "TextEdit" set targetText to text of front document end tell -- 用quoted form of处理文本中的特殊字符,避免shell解析错误 set cleanedText to do shell script "echo " & quoted form of targetText & " | sed -E 's/([^a-zA-Z0-9]):([^a-zA-Z0-9])/\\1\\2/g; s/([^a-zA-Z0-9]);([^a-zA-Z0-9])/\\1\\2/g; 其他正则规则'"
三、先在终端验证正则有效性
不要直接在AppleScript里调试,先在终端单独测试sed命令,用你的目标文本片段验证正则是否生效:
echo "你的测试文本内容" | sed -E 's/([^a-zA-Z0-9]):([^a-zA-Z0-9])/\1\2/g; s/([^a-zA-Z0-9]);([^a-zA-Z0-9])/\1\2/g'
只有终端里能正确替换,再把正则放到AppleScript里。
四、完整可运行示例脚本
tell application "TextEdit" if not (exists front document) then display alert "请先打开一个TextEdit文档" return end if set targetText to text of front document end tell try -- 合并所有sed清理规则,包含孤立标点处理 set cleanedText to do shell script "echo " & quoted form of targetText & " | sed -E ' s/([^a-zA-Z0-9]):([^a-zA-Z0-9])/\\1\\2/g; s/([^a-zA-Z0-9]);([^a-zA-Z0-9])/\\1\\2/g; s/\\s+/ /g; # 示例:合并多余空格 s/^\\s+|\\s+$//g # 示例:移除首尾空格 '" -- 将清理后的文本写回TextEdit tell application "TextEdit" set text of front document to cleanedText end tell on error errMsg display alert "执行错误:" & errMsg end try
五、无效果问题排查
- 检查
targetText是否正确获取:加一句display dialog targetText确认文本内容是否正确。 - 检查正则是否匹配你的文本实际格式:比如标点前后是否有特殊字符、空格,需要调整正则适配。
- 确认sed参数:必须加
-E才能支持扩展正则语法,否则分组等规则会失效。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

