2013-11-21 167 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是一個樣本,可以根據您的需要進行調整