如何用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
已尝试方案
- 获取10天前的基准日期:
tenDaysAgo=$(date -d "-10 days" +%Y-%m-%d) - 使用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 - 通过管道命令过滤并临时修改输出,但无法永久更新原文件:
问题:仅能在查看时临时移除$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 -k2t:字段,无法将修改保存到原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 }
执行命令
- 设置环境变量传递10天前的基准日期:
export TEN_DAYS_AGO=$(date -d "-10 days" +%Y-%m-%d) - 使用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
相关产品推荐
相关产品推荐

