Binary 在二进制文件中屏蔽某些文件路径
我有一个包含一些文件路径的二进制文件。如果路径以某个字符串开头,则应屏蔽文件路径的其余部分Binary 在二进制文件中屏蔽某些文件路径,binary,Binary,我有一个包含一些文件路径的二进制文件。如果路径以某个字符串开头,则应屏蔽文件路径的其余部分[\x20-\x7f]+,保持文件的一般结构和大小不变 因此,要搜索的路径列表如下: /usr/local/bin/ /home/joe/ 然后在二进制数据中出现如下情况: ^@^@^@^@/home/joe/documents/hello.docx^@^@^@^@ 应改为: ^@^@^@^@/home/joe/********************^@^@^@^@ 最好的方法是什么?sed、per
[\x20-\x7f]+
,保持文件的一般结构和大小不变
因此,要搜索的路径列表如下:
/usr/local/bin/
/home/joe/
然后在二进制数据中出现如下情况:
^@^@^@^@/home/joe/documents/hello.docx^@^@^@^@
应改为:
^@^@^@^@/home/joe/********************^@^@^@^@
最好的方法是什么?sed、perl或awk有办法吗?或者我必须编写一个C或PHP程序,在其中找到字符串并在其位置写入掩码字符的数量。这里有一些perl代码可以工作,尽管我相信它可以优化。它是一个过滤器,因此它将所有stdin读入
$data
,然后对数组@dirs
中的每个字符串替换模式。然而,替换不是一个固定字符串,而是一个函数调用replace($dir,$1)
,它是由于替换命令的e
修饰符而计算的
#!/usr/bin/perl
use strict;
sub replace{
my ($dir,$rest) = @_;
$rest =~ s/./*/g;
return $dir.$rest;
}
my @dirs = ('/usr/local/bin/','/home/joe/');
my $data = join("",<STDIN>);
foreach my $dir (@dirs){
$data =~ s|$dir([\x20-\x7f]+)|replace($dir,$1)|ge;
}
print $data;
#/usr/bin/perl
严格使用;
子替换{
我的($dir,$rest)=@;
$rest=~s/*/g;
返回$dir.$rest;
}
my@dirs=('/usr/local/bin/,'/home/joe/);
my$data=join(“,”);
foreach my$dir(@dirs){
$data=~s |$dir([\x20-\x7f]+)|替换($dir,$1)| ge;
}
打印$数据;
函数有两个参数,即目录和模式的捕获部分。替换捕获的字符串中的每个字符后,它返回这些串接的字符串。
perl
是处理二进制数据的一个好选择。对于sed
和awk
,通常只有GNU实现可以处理二进制数据,其他实现会阻塞NUL字节或两个换行符之间的长序列,或非终止行
perl -pi.back -e 's{(/usr/local/bin|/home/joe)/\K[\x20-\x7f]+}{
$& =~ s/./*/rg}ge' binary-file
对于/r
标志(返回替换结果,而不是将其应用于变量)和\K
(重置匹配字符串的开头),您不需要太旧的perl
版本
默认情况下,
perl-p
一次只在一行上工作,因为换行符不是[\x20-\x7f]
的一部分,这很好。这个解决方案是开箱即用的!非常适合在日志文件中匿名化个人信息。(在bin
后面缺少/
,但这就是细节!)@forthrin。谢谢,我现在已经将尾随的/
移出了交替,因此它适用于两条路径。