使用 sed 语法递增数字和计数

Incrementing Numbers & Counting with sed syntax

我正在努力研究 sed,并认为最好尝试使用一些简单但有用的东西。在工作中,每当用户 运行 特定脚本时,我都想在小型 LCD 显示屏上保持计数。我目前正在使用以下语法对总计数进行此操作:

oldnum=`cut -d ':' -f2 TotalCount.txt`
newnum=`expr $oldnum + 1`
sed -i "s/$oldnum$/$newnum/g" TotalCount.txt

这会修改包含这一行的文件:

Total Recordings:0

现在我想详细说明一下,每天从午夜开始增加数字并在 23:59:59 重置为零。我创建了一个辅助 .txt 文件供显示器读取,其中只有一行:

Total Recordings Today:0

但语法不会一样。上面的sed语法必须怎么改才能改变第二个文件对话框中的数字?

我可以使用 sed/bash 结合简单的 cron 作业按计划更改和重置文件。问题是我无法弄清楚 sed 的语法来复制与我最初开始工作时相同的效果。任何人都可以帮忙吗,我已经阅读了几个小时,最后决定 post 这个并煮一壶咖啡。我有一个 4 行 LCD,如果它足够容易学习语法,我很乐意跨时间表跟踪计数。

sed 应该可以很好地对文件中的 Total Recordings:Total Recordings Today: 进行递增,因为它正在寻找相同的模式。要每天在特定时间重置它,我会推荐一个 cronjob。

0 0 * * * echo \"Total Recordings Today:0\" > /path/to/TotalCount.txt >/dev/null 2>&1

我鼓励的其他事情是对 shell 扩展使用较新的样式语法 $( ... ),并为您的 TotalCount.txt 文件创建一个变量。

#!/bin/bash

totals=/path/to/TotalCount.txt
oldnum=$(cut -d ':' -f2 "$totals")
newnum=$((oldnum + 1))
sed -i "s/$oldnum$/$newnum/g" "$totals"

这样您就可以轻松地重复使用它来做任何您想用它做的事情,正确地引用它并简化您的代码。注意:在 OS X sed 就地扩展需要 sed -i ''.

当有疑问时,http://shellcheck.net 是一个非常好的工具,可以帮助您查找代码中的错误。

虽然您正在寻找 sed 解决方案,但无法抗拒 post 如何在 awk

中完成
$ awk -F: -v OFS=: '{++}1' file > temp && temp > file

-F:设置输入字段分隔符和-v OFS=:输出字段分隔符为:awk解析第二个字段并递增1,1是用于打印的 shorthand(可以替换为任何 "true" 值);输出将被写入一个临时文件,如果成功将覆盖原始输入文件(模拟就地编辑)。

Sed 是一个很好的工具,但众所周知它不是算术的最佳工具。如果文件不是今天最后修改的(或不存在),您可以通过在递增计数器之前将计数器初始化为零来使您已经拥有的工作:

[ `date +%Y-%m-%d` != "`stat --printf %z TotalCount.txt 2> /dev/null|cut -d ' ' -f 1`" ] && echo "Total Recordings Today:0" > TotalCount.txt

要对轮班做同样的事情,您可能会通过从纪元(即午夜)以来的秒数减去自午夜以来的第一个轮班开始时间(比如 7 * 3600)并除以轮班时间来计算轮班 "ordinal number" (8 * 3600) 并在发生变化时初始化计数器。类似于:

[ $(((`date +%s` - 7 * 3600) / (8 * 3600))) -gt $(((`stat --printf %Z TotalCount.txt 2> /dev/null` - 7 * 3600) / (8 * 3600))) ] && echo "Total Recordings This Shift:0" > TotalCount.txt