如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件

Posted

技术标签:

【中文标题】如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件【英文标题】:How can use sed/awk or other tool to assist in search and replace of 12GB subversion dump file 【发布时间】:2010-08-23 13:07:11 【问题描述】:

我遇到了一种特殊情况,我需要删除 Subversion 存储库中一系列提交的操作。 (/trunk /tags /branches) 的全部内容都被标记并在发现错误时随后被删除。我会简单地使用 svndumpfilter 删除有问题的节点,但有人在稍后重新使用了错误的标签名称,因此基于路径的排除会导致其他问题。我需要手动编辑 12GB 的转储文件。 我需要编辑一系列 15 个连续修订,它们以下列格式显示在转储中:

Revision-number: 60338
Prop-content-length: 143
Content-length: 143

K 7
svn:log
V 41
Tagging test prior to creating xx branch
K 10
svn:author
V 7
userx
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END

Node-path: test/tags/XX_8_0_FINAL
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 60337
Node-copyfrom-path: test

根据我所做的测试,我知道我需要将以上部分更改为以下部分

Revision-number: 60338
Prop-content-length: 112
Content-length: 112

K 7
svn:log
V 38
This is an empty revision for padding.
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END

还有 14 个修订版需要进行相同的替换。 尝试在 VIM 中手动编辑文件是非常不切实际的。转储文件是二进制和 ascii 文本的混合体。 如果有人有任何可以帮助我的 awk/sed 魔法,我将不胜感激。

【问题讨论】:

【参考方案1】:

首先要注意一点:sed 和 awk 设计用于处理纯文本文件。如果您的文件是二进制文件和 ascii 的混合文件,那么我不确定以下内容是否可行(我个人会使用 Perl)。

我假设“修订号:60338”是您想要用作触发器的东西(如果它出现在二进制文件中,天堂会帮助您)。将修改后的部分(“...这是一个空的修改...”)放在一个单独的文件中,例如,newsection。那么:

sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename

【讨论】:

【参考方案2】:

SvnDumpTool 怎么样?您也许可以将最初的“好”部分与增量转储的编辑部分结合起来。

【讨论】:

【参考方案3】:

我最终使用了以下步骤:

cat dump.file | grep -C 250 "Revision-number: xxxxx"

这给了我节点操作文件中“坏”提交的确切行号。 然后我使用 sed 删除每个提交的节点操作范围(按行号),如下所示:

sed -e "123,456d" -e "234,456d"

事实证明这非常快。 对于那些好奇的人,我需要完全删除这些的原因是因为我们的存储库扫描器(Atlassian Fisheye)需要数天时间来索引错误的提交。我使用的排除规则应该已经解决了这个问题,但结果我发现了一个排除规则的错误,该错误将在下一个 Fisheye 版本中修复。 看: http://jira.atlassian.com/browse/FE-2752

【讨论】:

【参考方案4】:

这些提交是否包含机密材料或删除它们的原因是什么?为什么不让他们在存储库中删除标签/分支,仅此而已。编辑:监督您已经删除了标签/分支...

【讨论】:

以上是关于如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本 正则表达式 grep sed awk 工具

sed awk 用户管理

linux三剑客的基本使用——grep、sed、awk

linux 下的 正则表达式(awk,sed,awk)学习

如何使用 sed/awk 替换逗号分隔字符串中的第 n 列/字段?

sed,awk工具学习