2013-11-21 171 views
0

逃离通配符的字符。我有两个文件exp.txt和log.txt的 是两个文件的内容如下使用shell脚本

exp.txt 
This file contains * and * 

log.txt 
This file contains 1322566331 and 236 

我如何比较这两个文件,我得到的回答为'相同'。数字1322566331和236可以是可变长度的。

我认为我不能使用正则表达式,因为exp.txt和log.txt可以包含不同的文本。我的最终目标是成功使用通配符,以便比较两个文件时它们之间没有区别。

+0

您的想法很可能适用;你试过了吗? – Rubens

+0

问题是文本也可以包含一些数字,我不想wilcard或文本可以不同。我不知道有关正则表达式作为解决方案 –

+0

您有两个文件,都带有诸如“Foo ”这样的行。如果我明白你的问题,你可以简单地删除所有这些句子,然后尝试匹配。比如'diff <(sed's/Foo [0-9] *和[0-9] * // g'file1)<(sed's/Foo [0-9] *和[0-9] * // g'file2)'应该可以做到。 (您可能需要维护句子的结构,但这只是删除数字而已)。 – Rubens

回答

0

一个快速和肮脏溶液:

#!/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 
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
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是一个样本,可以根据您的需要进行调整