我写了一个小程序来解析hg log
的命令行输出,它看起来像这样:
changeset: 90:abcdef012345
tag: tip
user: me
date: Sat Apr 30 17:42:05 2011 -0700
summary: Made another change
changeset: 89:def012345abc
user: me
date: Sat Apr 30 16:52:19 2011 -0700
summary: Made a change
实际上,我的程序足够通用,可以解析任何“键:值”对,只要每个新记录都由空行分隔即可。
现在我想疯狂地尝试对其他(真实)数据运行它。还有其他程序可以生成这样的“键:值”数据吗?
答案1
使用 tr 和 sed 两个命令,您可以将其转换为更像记录的格式:
echo 'changeset: 90echo 'changeset: 90:abcdef012345
tag: tip
user: me
date: Sat Apr 30 17:42:05 2011 -0700
summary: Made another change
changeset: 89:def012345abc
user: me
date: Sat Apr 30 16:52:19 2011 -0700
summary: Made a change
' | tr '\n' ';' | sed 's/;;/\n/'
changeset: 90:abcdef012345;tag: tip;user: me;date: Sat Apr 30 17:42:05 2011 -0700;summary: Made another change
changeset: 89:def012345abc;user: me;date: Sat Apr 30 16:52:19 2011 -0700;summary: Made a change;;
但是,如果这是您的格式,我会选择更像 CSV 的格式。您不需要在每一行中重复标题,并且使用制表符代替“;”或“,” (如果您不需要制表符作为内容),您将获得一种非常适合手动解析、比较行、使用 grep 查找行、使用 LibreOffice 生成图表或将数据放入数据库的格式。
如果您有更不稳定的格式,xml 可能会更好 - 并不是本身,而是因为那里有太多的工具。
在ESR 撰写的《Unix 编程艺术》第 5 章,也许你会为你的工作找到一些灵感。