Write a bit of code to create the regular expression for you:
$ cat 938725.pl
#!/usr/bin/perl
use strict;
use warnings;
my @search = ('GCGAT','CACGT');
# build regexes
my @newsearch;
for my $str (@search) {
my @tmp;
for my $char_idx (0 .. length($str)-1) {
my $t = $str;
substr($t,$char_idx,1,"[N".substr($t,$char_idx,1)."]");
push @tmp, $t;
}
push @newsearch, "^(".join("|",@tmp).")";
}
while (<DATA>) {
print "$.: $_";
for my $t (@newsearch) {
print "MATCH for /$t/\n" if /$t/;
}
}
__DATA__
GNGATNNNNNNNNNNNNNNN
GCGANBBBBBBBBBBBBBBB
CNCGTNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNN
$ perl 938725.pl
1: GNGATNNNNNNNNNNNNNNN
MATCH for /^([NG]CGAT|G[NC]GAT|GC[NG]AT|GCG[NA]T|GCGA[NT])/
2: GCGANBBBBBBBBBBBBBBB
MATCH for /^([NG]CGAT|G[NC]GAT|GC[NG]AT|GCG[NA]T|GCGA[NT])/
3: CNCGTNNNNNNNNNNNNNNN
MATCH for /^([NC]ACGT|C[NA]CGT|CA[NC]GT|CAC[NG]T|CACG[NT])/
4: NNNNNNNNNNNNNNNNNNNN
Update: D'oh! Of course jwkrahn is right, so I corrected & replaced the program. Original code (less output) is:
$ cat 938725.pl
#!/usr/bin/perl
use strict;
use warnings;
my @search = ('GCGAT','CACGT');
# build regexes
my @newsearch;
push @newsearch, "^".join("", map { "[N$_]" } split //,$_) for @search
+;
while (<DATA>) {
print "$.: $_";
for my $t (@newsearch) {
print "MATCH for /$t/\n" if /$t/;
}
}
__DATA__
GNGATNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
GCGANBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
+BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CNCGTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN