在相同位置查找和替换匹配的字母

Jae*_*ark 3 regex string bash perl

这是一个正则表达式的问题,但我在Wiki页面找不到适合我的案例的选项,所以我决定在这里问一下.可能是一个简单的未知选项正则表达式可以解决我的情况.

我有一个日志文件(a.txt),它有多行字符串.我想比较每两行(第1和第2,第3和第4 ......)并将匹配的字母(不是字符串)替换为"."(或任何特殊字符).

A.TXT:

1100110010
1100101100
0011001100
0110101111
.
.
.
Run Code Online (Sandbox Code Playgroud)

的Result.txt:

.....1001.
.....01100
.0.10...00
.1.01...11
.
.
.
Run Code Online (Sandbox Code Playgroud)

这可能是两个字符串的XOR问题,所以我尝试了这种方式,但它需要转换为ASCII然后XOR是可行的(可能这种方法不对).我认为有一种非常简单的方法可以用SED/PERL完成这项工作.任何建议和/或指导表示赞赏.感谢您阅读我的问题.

Mil*_*ler 5

使用按位运算符的 Perl :

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;

while ( !eof(DATA) ) {
    chomp( my $line1 = <DATA> );
    chomp( my $line2 = <DATA> );

    ( my $uniq_mask = $line1 ^ $line2 ) =~ s/[^\0]/\xFF/g;

    my $uniq1 = $line1;
    my $uniq2 = $line2;

    for ( $uniq1, $uniq2 ) {
        $_ &= $uniq_mask;
        s/\0/./g;
    }

    say for $line1, $line2, $uniq1, $uniq2, '';
}

__DATA__
1100110010
1100101100
0011001100
0110101111
Run Code Online (Sandbox Code Playgroud)

输出:

1100110010
1100101100
.....1001.
.....0110.

0011001100
0110101111
.0.10...00
.1.01...11
Run Code Online (Sandbox Code Playgroud)