【问题标题】:excerpt block from 2 text files and pipe to another utility从 2 个文本文件中提取块并通过管道传输到另一个实用程序
【发布时间】:2017-02-13 16:05:29
【问题描述】:

我正在尝试从 2 个文本文件中摘录一些内容,并使用 mailx 程序将其作为电子邮件正文发送。我正在尝试将其作为 bash 脚本来执行,因为我在创建简单 bash 脚本方面至少有有限的经验,因此在这方面有基本的知识。也就是说,我并不反对接受其他脚本选项,例如 perl/python/whatever。

我已经完成了我想使用 sed 的部分:sed -e '1,/excerpt delimiter 1/d' -e '/excerpt delimiter 2/,$d' file1.txt && sed -e '1,/excerpt delimiter one/d' -e '/excerpt delimiter two/,$d' file2.txt 输出到标准输出我打算进入电子邮件正文的内容。但是,由于我不完全清楚的原因,将内容传送到 mailx 是行不通的。也就是说sed -e '1,/excerpt delimiter 1/d' -e '/excerpt delimiter 2/,$d' file1.txt && sed -e '1,/excerpt delimiter one/d' -e '/excerpt delimiter two/,$d' file2.txt | mail -s excerpts me@mymail.me 不会在电子邮件正文中发送两个 sed 命令的输出:它只发送最后一个 sed 命令的输出。我试图理解为什么会这样,并通过将两个 sed 命令的输出放入电子邮件正文来解决问题。

进一步的背景。这两个文本文件包含多行文本,实际上是我使用 lynx 浏览器获得的网页转储。我只需要每个文件中的几行块,所以我使用 sed 来分隔我需要的块,并允许我从每个文件中删除这几行。如果我试图从一个文件而不是两个文件中删除,我的任务可能会更容易和/或更简单。但是由于包含我所追求的内容的网页需要输入登录凭据,并且因为我试图自动化这个过程,所以我使用 lynx 的 cmd_script 选项首先登录,然后保存(实际上是打印到文件)我需要的页面。据我所知,lynx 没有提供任何连接文件的方法,所以我似乎坚持使用两个单独的文件。

当然必须有替代方法来实现我的目标,而且我不受偏好或必要性的限制,可以使用任何特定的实用程序。唯一真正的限制是,因为我正在尝试自动执行此操作,所以它可以作为我可以作为 cron 作业调用的脚本来完成。我正在使用 Linux,并且可以使用所有标准的文本操作工具。可能很清楚,我的脚本知识/能力非常有限,所以我一直在尝试使用单线来完成我的目标。 mailx 已正确配置并在此系统上运行。

【问题讨论】:

    标签: bash sed mailx


    【解决方案1】:

    管道仅适用于&& 列表中的第一个命令。您需要将两者组合成一个 single 复合命令,其输出通过管道传送到 mailx

    { sed -e '1,/excerpt delimiter 1/d' \ 
          -e '/excerpt delimiter 2/,$d' file1.txt &&
      sed -e '1,/excerpt delimiter one/d' \
          -e '/excerpt delimiter two/,$d' file2.txt ; } |
     mail -s excerpts me@mymail.me
    

    【讨论】:

    • 这可能是他们在 bash 脚本 101 中教授的内容,但我们这些没有受过正规培训但只是在尝试完成有限任务的人不会知道。花括号为我解决了这个问题——谢谢 chepner
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多