如何区分线条的各个部分?

2023-12-08

我有两个文件想要比较。这些行有时间戳,可能还有一些我想在匹配算法中忽略的其他内容,但如果匹配算法发现文本的其余部分存在差异,我仍然希望输出这些项目。例如:

1c1
<    [junit4] 2013-01-11 04:43:57,392 INFO  com.example.MyClass:123 [main] [loadOverridePropFile] Config file application.properties not found: java.io.FileNotFoundException: /path/to/application.properties (No such file or directory)
---
>    [junit4] 2013-01-11 22:16:07,398 INFO  com.example.MyClass:123 [main] [loadOverridePropFile] Config file application.properties not found: java.io.FileNotFoundException: /path/to/application.properties (No such file or directory)

不应该被发射,但是:

1c1
<    [junit4] 2013-01-11 04:43:57,392 INFO  com.example.MyClass:123 [main] [loadOverridePropFile] Config file application.properties not found: java.io.FileNotFoundException: /path/to/application.properties (No such file or directory)
---
>    [junit4] 2013-01-11 22:16:07,398 INFO  com.example.MyClass:456 [main] [loadOverridePropFile] Config file application.properties not found: java.io.FileNotFoundException: /path/to/application.properties (No such file or directory)

应该发出(因为行号不同)。请注意,时间戳仍然会发出。

如何才能做到这一点?


我之前曾多次希望有这个功能,由于它再次出现在这里,我决定用谷歌搜索一下并找到了 perl 的Algorithm::Diff您可以将其提供给哈希函数(他们称之为“密钥生成函数”)“应该返回一个唯一标识给定元素的字符串”算法用来进行比较的内容(而不是您提供给它的实际内容)。

基本上,您需要做的就是添加一个 sub,它以您希望从字符串中过滤掉不需要的内容的方式执行一些正则表达式魔法,并将 subref 作为参数添加到调用中diff()(参见我的CHANGE 1 and CHANGE 2下面的代码片段中的评论)。

如果您需要正常(或统一)diff输出,检查详细的diffnew.pl模块附带的示例并在此文件中进行必要的更改。为了演示目的,我将使用简单的diff.pl它也附带,因为它很短,我可以将它完整地发布在这里。

mydiff.pl

#!/usr/bin/perl

# based on diff.pl that ships with Algorithm::Diff
# demonstrates the use of a key generation function

# the original diff.pl is:
# Copyright 1998 M-J. Dominus. ([email protected])
# This program is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.

use Algorithm::Diff qw(diff);

die("Usage: $0 file1 file2") unless @ARGV == 2;

my ($file1, $file2) = @ARGV;

-f $file1 or die("$file1: not a regular file");
-f $file2 or die("$file2: not a regular file");
-T $file1 or die("$file1: binary file");
-T $file2 or die("$file2: binary file");

open (F1, $file1) or die("Couldn't open $file1: $!");
open (F2, $file2) or die("Couldn't open $file2: $!");
chomp(@f1 = <F1>);
close F1;
chomp(@f2 = <F2>);
close F2;

# CHANGE 1
# $diffs = diff(\@f1, \@f2);
$diffs = diff(\@f1, \@f2, \&keyfunc);

exit 0 unless @$diffs;

foreach $chunk (@$diffs)
{
        foreach $line (@$chunk)
        {
                my ($sign, $lineno, $text) = @$line;
                printf "%4d$sign %s\n", $lineno+1, $text;
        }
}
exit 1;

# CHANGE 2 {
sub keyfunc
{
        my $_ = shift;
        s/^(\d{2}:\d{2})\s+//;
        return $_;
}
# }

one.txt

12:15 one two three
13:21 three four five

two.txt

10:01 one two three
14:38 seven six eight

示例运行

$ ./mydiff.pl one.txt two.txt
   2- 13:21 three four five
   2+ 13:21 seven six eight

示例运行 2

这是正常情况下的一个diff输出基于diffnew.pl

$ ./my_diffnew.pl one.txt two.txt
2c2
< 13:21 three four five
---
> 13:21 seven six eight

正如您所看到的,两个文件中的第一行都会被忽略,因为它们仅在时间戳上有所不同,并且哈希函数会删除这些行以进行比较。

瞧,您刚刚推出了自己的内容感知功能diff!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何区分线条的各个部分? 的相关文章

随机推荐

  • MongoDB - 使用聚合管道进行评论赞成/反对

    我正在尝试实现评论的赞成 反对机制 类似于 reddit 上的赞成 反对机制 我有一个单独的集合 名为commentReputation里面的文档可以是这样的 id ObjectId 5e5acb6d6034a879655c8819 com
  • 如何打开;另存为;然后从 PowerShell4 关闭 Excel 2013(启用宏)工作簿

    对上述 Com 操作进行搜索会产生 09 年甚至更早的链接 也许它没有改变 但我发现自己遇到了 它正在被另一个进程使用 的错误 即使我的桌面上没有打开 Excel 应用程序 我必须重新启动才能恢复 需要明确的是 我正在尝试打开一个现有文件
  • Heroku 应用程序启动超时

    我有一个相当大的 2 3 升级到 Rails 3 应用程序 它足够厚 无法通过 Heroku 的 60 秒启动门 因此它崩溃了 我已经做了很多工作来最大限度地减少 Gems 和初始化程序中的加载时间 但是有一些随机过程会消耗时间 而且我不太
  • C 解读声明

    好吧 这对我来说有点太多了 您如何阅读这些声明 char myCBT 10 请注意 我并不是专门要求提供这个示例 而是要求像我这样的初学者面临这样的难题时的一般经验法则 使用大卫 安德森的顺时针螺旋规则用于阅读此类符号
  • System.IO.FileSystemWatcher 的底层是如何工作的?

    我想了解 System IO FileSystemWatcher 在幕后是如何工作的 因为我有一个要求 我需要查看 100 个或更多文件夹下的所有文件 其中每个文件夹将包含大约 1K 个文件 我不确定我是否使用 FileSystemwatc
  • HiveUDF + saxon 9.1.0.8 + Java8 = 未能创建 XPathFactory

    我的 Spark 作业使用 HiveContext 和 Saxon 工作正常 除非代码中没有定义 UDF 在 UDF 实现的情况下 HiveContext 初始化失败并出现错误 我听说 saxon 9 5 1 5 中解决了 saxon ja
  • 解析器组合器:如何终止关键字重复

    我试图弄清楚如何使用关键字终止单词的重复 一个例子 class CAQueryLanguage extends JavaTokenParsers def expression START words END x gt println exp
  • CDI 扩展 - 在 ProcessAnnotatedType 阶段添加拦截器

    我正在尝试以编程方式添加拦截器 该拦截器称为 LogginInterceptor 仅记录其运行的方法的名称 当在方法上使用注释 Interceptors LogginInterceptor class 时 一切正常 然而 我正在尝试创建 C
  • 在运行时动态选择一个类

    我试图提出一个解决方案 在运行时根据消息类型选择处理 消息 的类 我知道我可以使用这样的东西 if msg type A MsgAProcessor execute message else if msg type B MsgBProces
  • IntelliJ IDEA 2016.3.4:构建过程异常终止

    我在 Intellij IDEA 中构建新的 java 项目时遇到错误 错误 构建过程异常终止 C Program Files Java jdk1 8 0 121 bin java Xmx700m Djava awt headless tr
  • 如何在 .NET SslStream 中为客户端身份验证指定接受的证书

    我正在尝试使用 Net System Security SslStream 类来处理具有客户端身份验证的 SSL TLS 流的服务器端 为了执行握手 我使用以下代码 SslStream sslStream new SslStream inn
  • 如何在 bash 中格式化数字,可能使用 printf ?

    这个如此简单的脚本失败了 bin bash n 1 printf v fn 05d n echo fn with 3 printf Illegal option v 为什么 Ubuntu 14 04 根据 Joe 这似乎是重复的以 scri
  • 为什么自定义函数引用一直指向旧函数

    我在 javascript设计模式 中找到了这个示例 并与以下代码的行为混淆 此代码创建一个自定义函数 var scareMe function alert Boo scareMe function alert Double boo 现在我
  • 使用
  • 而不包含
  • Closed 这个问题需要多问focused 目前不接受答案 插入有什么危险 li li 进入页面而不将项目包含在 ul 堵塞 例如 div style border solid 1px red li Item li li Another
  • 使用 Jenkins 执行 NUnit

    早上好 我想配置 Jenkins 服务器以使用插件运行 NUnitJenkins NUnit 插件但我尝试了很多东西但不起作用 我单击按钮 添加构建步骤 gt gt 执行Windows批处理命令但我在这里看到了http stackoverf
  • 我可以向现有静态类添加扩展方法吗?

    我很喜欢 C 中的扩展方法 但在向静态类添加扩展方法方面还没有取得任何成功 例如Console 例如 如果我想添加一个扩展Console 称为 WriteBlueLine 这样我就可以去 Console WriteBlueLine This
  • 在多行插入中使用 LAST_INSERT_ID()

    是否可以在插入查询中使用 LAST INSERT ID INSERT INTO mytable col1 col2 VALUES val1 null val2 LAST INSERT ID 尝试上面的 LAST INSERT ID 返回 0
  • 在表格边框上获取 Flutter DataTable 边框半径时出现问题

    我有一个DataTable我想添加一个边框半径 阅读完此内容后 我添加了DataTable to a Container小部件 当我不向标题添加背景颜色时 它效果很好 执行此操作时 整个表格的颜色都会改变 Container decorat
  • Python:通过套接字发送的消息大小

    我正在尝试使用发送消息socket图书馆 由于消息的大小是可变的 因此我决定在字符串的开头附加消息的大小 然后发送它 例如 如果消息是 Hello World 这是 13 个字符长 我已经计算过 EOL 我会发送类似的内容 sizeof13
  • 如何区分线条的各个部分?

    我有两个文件想要比较 这些行有时间戳 可能还有一些我想在匹配算法中忽略的其他内容 但如果匹配算法发现文本的其余部分存在差异 我仍然希望输出这些项目 例如 1c1 lt junit4 2013 01 11 04 43 57 392 INFO