如何通过AppleScript使用grep匹配变音符号及带重音字符
解决AppleScript中grep匹配含变音符号文本的问题
看起来你在AppleScript里调用grep匹配带特殊字符(比如变音符号)的文本时踩坑了,这种问题大多和编码一致性、字符串转义或者grep匹配模式有关,下面一步步给你解决:
1. 先确保全程UTF-8编码统一
你已经用pdftotext -enc UTF-8指定了转码格式,这步是对的,但要注意AppleScript和shell交互时也强制用UTF-8,避免编码乱码:
do shell script theCommand encoding "UTF-8"
2. 给特殊字符做shell安全转义
AppleScript里的文件夹名称(比如带ä、ö、ü的名称)直接传给shell会被误解析,必须用quoted form of把字符串包裹起来,让shell把它当成纯文本处理:
-- 错误写法:直接拼接字符串 -- set grepCmd to "grep " & companyName & " " & searchFile -- 正确写法:用quoted form转义特殊字符 set grepCmd to "grep " & quoted form of companyName & " " & quoted form of searchFile
3. 用grep的固定字符串匹配模式
如果你的需求只是检查名称是否存在,不需要正则匹配,一定要加-F参数(固定字符串匹配),避免变音符号或其他字符被当成正则元字符解析。另外加上-a参数确保grep把文件当成纯文本处理:
set grepCmd to "grep -F -a " & quoted form of companyName & " " & quoted form of searchFile
4. 整合后的完整脚本示例
把这些修正放到你的脚本里,大概是这样:
set searchFile to "/tmp/output.txt" set pdfPath to "/path/to/your/some.pdf" -- 替换成你的PDF实际路径 set theCommand to "/usr/local/bin/pdftotext -enc UTF-8 " & quoted form of pdfPath & " " & quoted form of searchFile do shell script theCommand encoding "UTF-8" tell application "Finder" set companies to name of folders of folder "/path/to/your/target/folder" -- 替换成你的目录路径 end tell repeat with companyName in companies set grepCmd to "grep -F -a " & quoted form of companyName & " " & quoted form of searchFile try set grepResult to do shell script grepCmd encoding "UTF-8" -- 匹配到的逻辑 log companyName & " 已在文件中找到" on error -- 未匹配到的逻辑 log companyName & " 未在文件中找到" end try end repeat
额外排查小技巧
- 直接在终端测试grep命令:比如
grep -F -a "Müller" /tmp/output.txt,如果终端能匹配到但脚本不行,那就是AppleScript的字符串传递问题;如果终端也匹配不到,就检查output.txt里的变音符号是否显示正常(可能pdftotext转码有误,试试-enc Latin1之类的编码)。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

