You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWK永久删除todo.txt中早于指定天数的t:日期字段

处理todo.txt中过期t:字段并永久修改文件

需求

找出todo.txt格式待办列表中所有t:字段日期早于当前日期10天前的任务,移除该行对应的t:<日期>字段,并将修改永久应用到原数据文件中。仅移除日期早于基准日(示例中为2023-05-18)10天的t:2023-05-07这类字段。

输入示例数据

(A) Important task +project @context t:2023-05-07 due:2023-6-01 rec:1d
(B) Paint bedroom wall +house @bedroom t:2023-05-07 due:2023-6-07 rec:1d
(C) Pick up dry cleaning due:2023-05-19 +home @town
(C) Buy kitchen towels t:2023-05-19 +house @town

期望输出数据

(A) Important task +project @context due:2023-6-01 rec:1d
(B) Paint bedroom wall +house @bedroom due:2023-6-07 rec:1d
(C) Pick up dry cleaning due:2023-05-19 +home @town
(C) Buy kitchen towels t:2023-05-19 +house @town

已尝试方案

  1. 获取10天前的基准日期:
    tenDaysAgo=$(date -d "-10 days" +%Y-%m-%d)
    
  2. 使用Ed Morton的start-past.awk脚本判断t:字段日期是否过期:
    start-past.awk:
    {
        orig = $0
        sched = ""
        for (i=NF; i>0; i--)
        {
            if ( sub(/^t:/,"",$i) )
            {
                sched = $i
            }
        }
        sched = substr(sched,1,10)
        $0 = orig
    }
    sched < date
    
  3. 通过管道命令过滤并临时修改输出,但无法永久更新原文件:
    $TODO_SH ls | awk '$0 ~ /t:/' \
    | awk -v date="$tenDaysAgo" -f ~/bin/todo/start-past.awk \
    | sed -E 's/t:[0-9]{4}-[0-9]{2}-[0-9]{2}//g' | sort -k2
    
    问题:仅能在查看时临时移除t:字段,无法将修改保存到原todo.txt文件。

解决方案

编写一个完整的awk脚本,一次性完成日期判断和字段移除,直接修改原文件(推荐使用gawk的-i inplace选项实现原地修改,避免手动处理临时文件)。

完整awk脚本(remove-expired-t.awk)

BEGIN {
    # 从环境变量读取基准日期
    date = ENVIRON["TEN_DAYS_AGO"]
}

{
    modified_line = ""
    sched_date = ""
    
    # 遍历每行的所有字段,筛选需要保留的内容
    for (i=1; i<=NF; i++) {
        if ($i ~ /^t:[0-9]{4}-[0-9]{2}-[0-9]{2}$/) {
            # 提取日期部分
            sched_date = substr($i, 3)
            # 日期过期则跳过该字段
            if (sched_date < date) {
                continue
            }
        }
        # 将保留的字段拼接成新行
        modified_line = modified_line $i " "
    }
    
    # 去除末尾多余空格,输出结果
    sub(/ $/, "", modified_line)
    print modified_line ? modified_line : $0
}

执行命令

  1. 设置环境变量传递10天前的基准日期:
    export TEN_DAYS_AGO=$(date -d "-10 days" +%Y-%m-%d)
    
  2. 使用gawk原地修改todo.txt文件:
    gawk -i inplace -f remove-expired-t.awk /path/to/your/todo.txt
    

补充说明

  • 脚本会自动跳过过期的t:字段,保留其他所有内容;无t:字段或日期未过期的行将原样输出。
  • 使用-i inplace时,gawk默认会生成后缀为~的备份文件,若不需要备份,可添加参数关闭:
    gawk -i inplace -v inplace_suffix="" -f remove-expired-t.awk /path/to/your/todo.txt
    

内容的提问来源于stack exchange,提问作者Tony Barganski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:23:21