bash - 如何将 org 文件中的最新条目输出并格式化到终端?

标签 bash awk emacs terminal org-mode

我使用 emacs 和结构如下的 org 文件记录每日笔记:

#+SEQ_TODO: TODO(t) IN_PROGRESS(p) BLOCKED(b) ON_HOLD(h) OPEN(o) QA(q) | DONE(d) CANCELLED(c)

* Notes <2019-04-19 Fri>
** To do:
*** Item 1
*** Item 2
* Notes <2019-04-18 Thu>
** To do:
*** Item 1
*** Item 2
*** Item 3
*** Item 4
etc.

我想在终端中输出最新条目(可能通过 grep、cat、sed 或其他方式),例如,如果我在终端中键入 todo,它将输出:

* Notes <2019-04-19 Fri>
** To do:
*** Item 1
*** Item 2

我已经尝试过 grep -A 5 -i "2019-04-18"~/Documentes/notes.org 之类的操作,但不想手动指定要执行的行数输出(列表可以是 2 行或 10 行)。我还尝试了一些 sed 并尝试在单词之间输出,但运气不佳。

最佳答案

假设最新条目总是在顶部:

$ awk '(c+=/^\* Notes/)>1{exit} c' file
* Notes <2019-04-19 Fri>
** To do:
*** Item 1
*** Item 2

对于文件中的每一行;如果该行匹配 ^\* Notes,则将 c 加 1;如果 c 大于 1,则退出;如果 c 大于零,则打印该行。

而且,如果在 Notes 之前只有一个星号后跟一个空格,您可以从正则表达式中删除 Notes:

awk '(c+=/^\* /)>1{exit} c' file

关于bash - 如何将 org 文件中的最新条目输出并格式化到终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797089/

相关文章:

php - 长时间运行的 PHP 脚本在通过 exec() 调用时停止,但在通过 CLI 调用时结束

function - awk 在重定向中出现函数调用错误

Emacs 自动完成不显示结果

emacs - 验证一行中正确的字段数?

Emacs Lisp : How to sum odd numbers in a list?

windows - Windows 中的 Netcat Web 服务器

linux - 用于终止早于 x 时间的进程的 Bash 脚本 - 表达式中的语法错误

linux - 如何在 bash 中确定/mountpoint 是否是从其他操作系统挂载的?

linux - 如何从文件的每一行中获取元素,并将它们添加到不同文件的每一行中的每个条目之前?

awk - 在 awk 中编写脚本