使用shell脚本转义通配符

时间:2013-11-21 21:27:48

标签: bash shell sed

我有两个文件exp.txt和log.txt 这两个文件的内容如下

exp.txt
This file contains * and *

log.txt
This file contains 1322566331 and 236

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

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

3 个答案:

答案 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)

快速而肮脏的解决方案:

#!/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