如何在AppleScript中选择行

时间:2015-08-31 23:32:05

标签: applescript

我试图找出如何在日志文件中的一长串文本中使用Text Item Delimiters。

在信息记录中,总有一个不变的短语,我正在搜索哪个短语引导我进入文本行。例如,我通过搜索" [常量]" 来到达我想要的行。

我遇到的问题是我无法选择整行来执行分隔符。下面是日志的基本示例。

qwertyuiop
mnbvcxza
oqeryuiiop
[Constant] 1234567890123456-098765432109876-8765432118976543
odgnsgnsanfadf
joiergjdfmgadfs

任何建议都将不胜感激。 到目前为止我用的是:

repeat 16 times
key code 124 using (shift down)
end repeat

工作正常,但很笨重。

2 个答案:

答案 0 :(得分:0)

查找包含特定字符串的文本行的简单方法是shell命令grep

set theConstant to "Constant"

set theText to "qwertyuiop
mnbvcxza
oqeryuiiop
Constant 1234567890123456-098765432109876-8765432118976543
odgnsgnsanfadf
joiergjdfmgadfs"

set foundLine to do shell script "echo " & quoted form of theText & " | tr '\\r' '\\n' | grep " & quoted form of theConstant

tr部分用return(0x0d)字符替换linefeed(0x0a)字符是符合shell行分隔符要求所必需的。

如果常量包含特殊字符,则它会更复杂,因为在将字符传递给shell之前必须先转义它们。

set theConstant to "\\[Constant\\]"

set theText to "qwertyuiop
mnbvcxza
oqeryuiiop
[Constant] 1234567890123456-098765432109876-8765432118976543
odgnsgnsanfadf
joiergjdfmgadfs"

set foundLine to do shell script "echo " & quoted form of theText & " | tr '\\r' '\\n' | grep " & quoted form of theConstant

如果要从磁盘上的文件中读取文本,可以使用此

set logFile to (path to library folder from user domain as text) & "Logs:myLogFile.log"
set theText to read file logFile as «class utf8»

答案 1 :(得分:0)

你的问题令人费解。您是否要解析文本/日志文件或脚本以使用某些应用程序的GUI?因为这就是你的代码所暗示的......

如果你想解析一个更容易的日志文件,你可以使用OSX自带的老式Unix工具。您可以在Applescript中使用它们,就像这样...

set logfile to "/some/path/file.log"

# Quote the string in case it contains spaces... or add single quotes above...
set qlogfile to quoted form of logfile

# Prepare the shell command to run
set cmd to "grep '^\\[Constant]' " & qlogfile & " | cut -c 12- | tr '-' '\\n'"

# Run it and capture the output
try
set cmdoutput to (do shell script cmd)
on error
   # Oh no, command errored. Best we do something there
end try

结果看起来像这样......

tell current application
    do shell script "grep '^\\[Constant]' '/some/path/file.log' | cut -c 12- | tr '-' '\\n'"
        --> "1234567890123456
098765432109876
8765432118976543"
end tell
Result:
"1234567890123456
098765432109876
8765432118976543"

所以要分解shell命令是

  • grep ... |将读取文件的内容,并选择以文本^开头[Constant]的所有行,并将其找到|的内容传递给下一个命令< / LI>
  • cut将字符从12位置切换到该行的结尾-
  • tr将所有字​​符-替换为\n,这是unix中换行符的代码。

你看到的\\是由于它是从Applescript内部执行的。如果你在终端内运行它,你只需要打开。

如果你想知道另一行的一行内容,那么删除最后一个命令| tr '-' '\\n',它将返回

Result:
"1234567890123456-098765432109876-8765432118976543"