【问题标题】:How to `diff` files to create a "common" file?如何区分文件以创建“通用”文件?
【发布时间】:2013-10-09 17:13:53
【问题描述】:

我有大量的 CSS 文件要处理,有人刚刚对许多子网站上的各种核心样式表进行了更改,因此有些抱怨。显然,如果最初的开发者有一些远见,他们只会包含一个主样式表并覆盖必要的元素......

我最初从comm 开始,认为它可能会成功,但很快发现它需要接收排序的输入文件。

然后我切换到diff 并通过阅读和research 得到以下内容:

diff --unchanged-group-format="@@ %dn,%df%c'\012'%<" --old-group-format='' --new-group-format='' --changed-group-format='' file_1.css file_2.css

前面的明明差不多了,但是:

A) 我需要找出@@ 行(应该没问题,对吗?乍一看这似乎是正确的,但diff 是否会添加任何其他需要的意外行被猛拉?)然后

B)我需要再创建两个文件,首先是 file_1.css 中剩余的唯一行,然后是 file_2.css 中剩余的唯一行。

显然,第一个“共同”文件将进入包含文件夹,然后作为 @import url("common.css"); 包含到后面创建的两个文件中

我认为以下简单的更改将创建我所指的后两个文件:

diff --unchanged-group-format='' --old-group-format="@@ %dn,%df%c'\012'%<" --new-group-format='' --changed-group-format='' file_1.css file_2.css

diff --unchanged-group-format='' --old-group-format='' --new-group-format="@@ %dn,%df%c'\012'%<" file_1.css file_2.css

示例文件:

文件 1:https://gist.github.com/c13843972c47b5037704

文件 2:https://gist.github.com/fff39eae386e8969dc10

例如,在执行以下测试时:

diff --unchanged-group-format="@@ %dn,%df%c'\012'%<" --old-group-format='' --new-group-format=''   --changed-group-format='' file_1.css file_2.css | egrep -v "^@@\d*" > common.css

diff --unchanged-group-format='' --old-group-format="@@ %dn,%df%c'\012'%<" --new-group-format=''   --changed-group-format='' file_1.css file_2.css | egrep -v "^@@\d*" > old.css

然后用egrep "^body" *css 搜索body,它只在common.css 中产生了一个主体,而在old.css 中没有一个主体,而它表明在file_1.cssfile_2.css 中有两个不同的条目。所以很明显这种方法是有缺陷的。

如何创建这两个最终成为通用包含和覆盖文件的文件?

【问题讨论】:

  • 您能否提供输入文件的示例和您的预期输出。
  • @anubhava 你去吧。
  • 可能帮不上什么忙,但您或许可以先合并这些文件,然后使用zamez.org/factorcss 之类的东西?
  • 有趣的@stephenhay,但是系统不断在 gist 原始链接上抛出错误。奇怪的是它应该以 css 结尾,但肯定会导致对结果缺乏信任。
  • 哦,真不幸。希望你能找到解决办法。

标签: css bash shell diff zsh


【解决方案1】:

@ylluminate,你有几个选择:

  1. 使用 BeyondCompare 直观地验证差异。它在比较相似文件方面做得非常出色。它允许保存公共行/仅左行/仅右行。唯一的缺点是它是交互式的,如果您有很多文件,则需要一些时间。从积极的方面来说,您似乎想先通过几次测试来建立信任。
  2. 为 --changed-group-format 添加格式文本并捕获修改后的代码(以及您的命令现在执行的旧代码)。您需要再进行一次比较才能获得新代码中的内容,而不是旧代码中的内容。缺点是验证会很困难。
  3. 保存数据库表中的所有行并比较列是另一种选择。注意存储新旧行号。缺点是数据行需要唯一,空行会被截掉。

如果我的文件少于 50 个,我会选择选项 1。

希望这会有所帮助。

PS:我与 BeyondCompare 没有任何关系。只是软件的快乐用户

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多