我有两个文件exp.txt和log.txt 这两个文件的内容如下
exp.txt
This file contains * and *
log.txt
This file contains 1322566331 and 236
如何比较这两个文件,以便我得到答案为“相同”。数字1322566331和236可以是可变长度。
我认为我不能使用正则表达式,因为exp.txt和log.txt可以包含不同的文本。我的最终目标是成功使用通配符,以便在比较两个文件时它们之间没有区别。
答案 0 :(得分:1)
看起来exp.txt
就像一个模板,您想检查log.txt
是否匹配。如果你这样写exp.txt
:
This file contains [^ ]+ and [^ ]+
...然后你可以检查log.txt
是否匹配如下:
grep -Eqf exp.txt jack.txt && echo matches || echo not
例如:
$ echo 'This file contains 1322566331 and 236' > a.txt
$ echo hello > b.txt
$ grep -Eqf exp.txt a.txt && echo matches || echo not
matches
$ grep -Eqf exp.txt b.txt && echo matches || echo not
not
答案 1 :(得分:1)
sed "s/[*]/[^ ]\{1,\}/g" exp.txt | while read ThisExp
do
sed "s/\(^${ThisExp}$\)/Same: \1/p;t;s/.*/Different/" log.txt
done
如果*
仅为数字sed "s/[*]/[0-9]\{1,\}/g"
第二个sed是一个样本,可以根据您的需要进行调整
答案 2 :(得分:0)
快速而肮脏的perl解决方案:
#!/usr/bin/env perl
use warnings;
use strict;
my ($exp, $log) = <>;
$exp =~ s/([^*]*)/\Q$1\E/g;
$exp =~ s/\*/\\d+/g;
if ( $log =~ m/$exp/ ) {
print "Same\n";
}
它读取变量的两行,用匹配数字(\d+
)的正则表达式替换wilcards,并使用quotemeta()
等效\Q
和\E
来转义所有其他内容。然后我使用正则表达式匹配来检查它们是否相等。
它产生:
Same