你可以使用sed或perl -pe从二进制文件中删除一个部分吗?

hyp*_*not 2 regex perl replace sed

我试图从二进制文件中删除ANSI字符串"stringstart"和"stringend"之间的部分.用sed或perl -pe可以做到这一点吗?

我正在考虑一些Regex解决方案,但我不知道如何编写它或者正则表达式如何与二进制文件一起工作.

Jon*_*ler 6

sed设计用于处理文本文件而不是二进制文件,尽管这些日子的区别通常不如以前那么重要.最大的问题是文本文件不包含零字节(值为0的字节)和二进制文件,并且许多C字符串处理函数在第一个零字节处停止. sed还会读取由换行符标记的"行".因此,二进制文件最终可能会出现长行.最后,无法保证字符串开始和结束标记相对于换行符的相对位置.sed与Perl相比,所有这些特性都不适合这项工作.

在Perl中,我非常想将文件粘贴到内存中,使用适当的正则表达式从内存映像中删除数据,然后将结果写回适当的位置.

perl -e 'local($/); $data = <>; $data =~ s/stringstart(.*?)stringend//gms; print $data'
Run Code Online (Sandbox Code Playgroud)

现在测试 - 测试数据使用:

#!/usr/bin/env perl
use strict;
use warnings;

sub full_set
{
    foreach my $i (0..255) { printf "%c", $i; }
}
sub random_set
{
    my($n) = @_;
    foreach my $i (0..$n) { printf "%c", int(rand(255)); }
}

full_set;
random_set(1024);
printf("stringstart");
full_set;
random_set(512);
full_set;
printf("stringend");
random_set(256);
Run Code Online (Sandbox Code Playgroud)

该脚本从输入中删除1045个字符 - 对应于'stringstart','stringend'(20)+ 2*256 + 513(因为random_set(512)打印513个字符).

请注意,主脚本会立即将所有文件读入内存.如果你希望它一次处理一个文件,你将不得不更努力地工作; 它可能不再是一个单行.