【问题标题】:Read a text file with Automator.app line by line使用 Automator.app 逐行读取文本文件
【发布时间】:2014-09-11 06:01:19
【问题描述】:

我是编码新手,所以请耐心等待。

我使用 Automator (OSX) 创建了一个工作流,它运行良好。我唯一的问题是我希望它在多个输入上运行(即作为批处理)。我已经插入了循环操作,但我遇到的问题是每次都更改初始输入。

我想每次使用一个applescript来自动插入初始输入。

我有一个带有 URL 的 TXT 文件。使用苹果脚本,我想将一个 URL(或一行文本)复制到剪贴板。 在下一次迭代中,我想复制下一个 URL(或文本行)。

谁能帮忙?

谢谢!!

【问题讨论】:

  • 那么,整个autmator应该只做下一个吗? 1.)从文件中获取下一行(开始时的第一个),2.)将该行复制到剪贴板,3.)重新开始? (手动循环(按键),还是按计数自动循环?)
  • @jm666 Automator 会做: 1. 从文件中获取下一行(开始时的第一个) 2. 将行复制到剪贴板 3. 完成工作流中的所有剩余任务(这已经完成由我完成,这里没有问题) 4. 循环(按计数自动完成,也由我完成,这里没有问题)

标签: shell applescript automator


【解决方案1】:

您可以创建一个循环的工作流程(称为 LinesToClipboard.workflow)会做什么

  • 从文本文件(不是 rtf 或 doc)中获取一行
  • 将该行复制到剪贴板
  • 运行您当前的工作流程
  • 下一行再次循环

工作流程:

  • 创建新的自动化工作流
  • 创建一个变量
    • 在底部找到“显示或隐藏工作流变量列表”图标并显示工作流变量(空)
    • 右键单击并“新建变量...”
    • 将变量命名为“LineNumber”
  • 添加操作:
    • Get Value of Variable(行号)
    • Run Shell Script
    • 外壳:/bin/bash
    • 重要:将Pass input 更改为as arguments
    • 添加以下内容(准确复制,包括所有引号等):
    • 在脚本内容中,将/etc/passwd更改为文件名的完整路径,如/Users/myname/Documents/myfile.txt
    • 在此操作结束时,剪贴板将包含文件中的一行
linenum=${1:-0}
filename="/etc/passwd" # full path of your text-filename
let linenum++
sed -n "${linenum}p" < "$filename" | pbcopy
echo $linenum
  • Set Value of Variable(行号)
  • Run Workflow - 添加您当前的工作流程(或“ShowClipboard.workflow” - 见下文)
    • 应该检查Wait for workflow to finish
    • 重要输出菜单应为:“返回操作输入”
  • Loop
    • 添加您的计数...
  • Run Shell Script(忽略此操作的输入),内容一行:echo 0(循环结束时,这会将变量 LineNumber 重置为零)
  • Set Value of Variable(行号)

为了测试,您可以创建另一个名为 ShowClipboard.workflow 的工作流,其内容为:

  • Get Contents of Cliboard
  • Set Value of Variable(剪辑)
  • Ask for confirmation(并将(clipval) 拖到消息字段中)

运行第一个工作流。

截图(当然):)

第二个工作流程(用于测试)

【讨论】:

  • 工作就像一个魅力!!!绝对的传奇,伙计!谢谢,一天的 youtube 和谷歌搜索并没有像你那样帮助!
  • @HarisAhmed 享受 ;),很高兴为您提供帮助。 ;)
  • Thaaaaaaaaaaaaaaaaaaaaaaaaaanks 很多
【解决方案2】:

您不需要 AppleScript 来获取 URL,但可以通过使用 shell 任务使用 Automator 直接提取它们。使用获取文件夹内容的任务(这是 Automator 中的 Finder 任务)后,添加一个 shell 任务作为下一个任务。确保选择将输入作为参数发送,而不是将其发送到标准输入。完成后,您只需要以下 shell 脚本之一。

cat $@ | egrep -io '\S?(http|https|ftp|afp|smb|mailto|webcal):\S+''

它首先使用 cat 读取所有文件。 $@ 是一个 shell 变量,其中包含上一个任务收集的参数:批处理文件夹的所有文件的路径列表。我们将它们通过管道传送到 egrep will,它只会输出由它们的方案过滤的 URL。如果您想支持任何方案(官方和非官方方案):

cat $@ | egrep -io '\S?[A-Z][A-Z0-9+-.]+:\S+'

【讨论】:

  • 我使用了你给我的 shell 脚本,效果很好.. ' cat $@ | egrep -io '\S?(http):\S+' ' 但是,因为现在所有 URL 都在一起处理,所以 Automator 大约有 25% 的时间会在工作流程中进一步崩溃。我只用最多 4 个 URL 对它进行了测试现在(但我希望插入更多 URL 会更频繁地失败)。理想情况下,我希望它可以处理大约 75-100 个 URL。这就是为什么我希望一个 URL 在开始下一个 URL 之前运行整个过程。
  • 我认为它会崩溃,因为当文件不包含 URL 时它会返回错误。您可以在命令末尾添加“|| true”。 ||是一个或,这意味着当 grep 失败时,它将通过执行 true 命令返回空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2015-05-13
  • 2020-09-11
相关资源
最近更新 更多