![计算文本变化的方法](https://linux22.com/image/143497/%E8%AE%A1%E7%AE%97%E6%96%87%E6%9C%AC%E5%8F%98%E5%8C%96%E7%9A%84%E6%96%B9%E6%B3%95.png)
有人知道该算法将采用 1 个文本、第 2 个文本,并在我已经知道第一个文本时给出如何构建第二个文本的最少说明吗?
例如“正常运行时间”的输出:
16:18 up 1 day, 12:15, 4 users, load averages: 2.23 2.66 2.53
一分钟后:
16:19 up 1 day, 12:16, 4 users, load averages: 2.23 2.66 2.53
在这种情况下,唯一的变化是时间。
任何格式的输出都是可接受的以下示例只是我如何构建用于从第一行构建第二行的信息的想法之一。
将第一次正常运行时间调用与第二次调用进行比较时的输出示例:
4:1:9
21:1:6
4:1:9(在要删除的位置 4 - 1 个字符处,添加“9”)
21:1:6(在位置 21 - 要删除的 1 个字符处,添加“6”)
也许我可以只使用 git 的一些命令,但我正在寻找尽可能简单的解决方案,最好没有任何依赖项,可以在任何能够运行 shell 脚本的机器上运行。
更新以更好地了解我正在尝试对此做什么。
需要使用此 diff 解决方案来节省字节。 Trafikito.com 代理正在服务器上运行,并将一些命令的输出(例如uptime
free -m
等)发送到 API 端点。这种情况每分钟发生一次,并为服务器生成一些出站流量。我想通过仅发送差异来减少网络上的占用空间。而大多数时候,所有输出中只有几个数字发生变化。
diff
- 该工具逐行比较,这对于uptime
输出只有一行的命令没有意义。
cmp
- 该工具逐字节比较,但命令的输出很大。如果该字节插入到字符串的开头,它将显示所有即将到来的字节的差异。它可能只是显示移动所有其余内容并在位置 x 插入新内容。
答案1
您是否考虑过cmp
:
cmp -lb file[12]
5 70 8 71 9
22 65 5 66 6
答案2
$ diff -e uptime1 uptime2
1c
16:19 up 1 day, 12:16, 4 users, load averages: 2.23 2.66 2.53
.
diff -e
输出一个ed
脚本,适合将第一个文件转换为第二个文件。它仅添加、删除或更改完整的行。
创建并应用脚本:
$ diff -e uptime1 uptime2 >diff.ed
之后:
$ { cat diff.ed; echo ',p'; } | ed -s uptime1 >newfile
这会将 的内容转换uptime1
为 中的内容uptime2
。是echo ',p'
将ed
结果文件写入标准输出(然后保存在newfile
)。
或者,可以使用该实用程序应用四种类型的输出diff
(正常、统一、上下文和 ed)中的任何一种patch
:
$ patch uptime1 <diff.ed
Hmm... Looks like an ed script to me...
Patching file uptime1 using Plan A...
Hmm... Ignoring the trailing garbage.
done
diff
请参阅patch
您的系统的手册。