Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 在二进制文件中屏蔽某些文件路径_Binary - Fatal编程技术网

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。谢谢,我现在已经将尾随的
/
移出了交替,因此它适用于两条路径。